Заменить все значения в одном столбце на 1

8

У меня есть несколько текстовых файлов, содержащих 12 строк и 3 столбца.

Пример:

2       6    0.74  
42      6    0.58  
80      6    0  
112     6    0.24  
132     6    1  
216     6    0.7  
342     6    0  
390     6    0.21  
432     6    0.56  
466     6    0.75  
524     6    0.6  
646     6    0.9 

Я хочу установить для всех значений третьего столбца значение 1 во всех строках.

Вывод должен выглядеть так:

2    6   1  
42   6   1  
80   6   1  
112  6   1  
132  6   1  
216  6   1  
342  6   1  
390  6   1  
432  6   1  
466  6   1  
524  6   1  
646  6   1  

Кто-нибудь знает команду, которая может решить эту проблему?

user203269
источник

Ответы:

16
awk '{print $1, $2, "1"}' inputfile
user1700494
источник
1
Эта команда правильно печатает первую строку в текстовом файле в терминале, но не вносит изменения в файл ...
user203269
перенаправить вывод в другой файлawk '{print $1, $2, "1"}' inputfile > newfile
user1700494
Спасибо! Это работает, но записывает только первую строку, столбцы 1, 2 и 3. Я хотел бы выписать все 12 строк одинаково :)
user203269
12

пытаться

AWK

 awk '{$3=1 ; print ;}' oldfile > newfile
  • $3 = 1 установит третье поле на 1

sed (здесь GNU или busybox sedс -iвозможностью редактирования на месте)

sed -i 's/[0-9.]*$/1/' file
  • [0-9.]*$представляет собой последовательность из , 0чтобы 9и .до конца строки.

сед (гольф 4 байта)

sed -i 's/[^ ]*$/1/' file
  • [^ ]*$ любой символ, кроме пробела, до конца строки.
Archemar
источник
3
Давайте кодегольф:: sed 's/[^ ]*$/1/'->
Ipor Sircer
Спасибо огромное! :) Кажется, что работает awk, за исключением первой строки: 2 6 1 6 1 80 6 1 112 6 1 132 6 1 216 6 1 342 6 1 390 6 1 432 6 1 466 6 1 524 6 1 646 6 1 первая строка печатает 2-е и 3-е значение дважды?
user203269
@ user203269 У меня отлично работает awk-версия (хотя и с проблемой форматирования)
Archemar
3
awkигра в гольф: awk \$3=1(POSIX, но не будет работать с awk из 70-х, как указано в / bin на Solaris)
Стефан Шазелас
это awkрешение действительно круто .... не могли бы вы объяснить, пожалуйста
маз
5

Строки в ожидаемом выводе, кажется, заканчиваются двумя пробелами и имеют поля, разделенные одной вкладкой и одним пробелом.

Если это действительно то, что вы хотите, то вам нужно:

awk -v 'OFS=\t ' '$3="1  "' < infile > outfile

Или с sed:

tab=$(printf '\t')
sed "
  s/[[:blank:]]\{1,\}/$tab /g
  s/[^[:blank:]]\{1,\}[[:blank:]]*$/1  /
  s/^[[:blank:]]*//" < infile > outfile
Стефан Шазелас
источник
Почему пробелы после 1?
123
@ 123, как я уже сказал, в ожидаемом выводе OP каждая строка заканчивается двумя пробелами.
Стефан Шазелас
Ошибочно считал, что вы сказали, что поля разделены двумя пробелами и табуляцией. моя вина.
123
Привет Стефан, Этот awk правильно выполняет первые три значения, затем удаляет строку 1
столбца
1
@ user203269, сначала конвертируй свой файл из MS-DOS в Unix.
Стефан Шазелас
3

Просто с помощью GNU sed, используя -iдля замены текста прямо в файле:

sed -i 's:\(.*\s\)\(.*\s\)\(.*\):\1\21:g' textfile

Столбцы подбираются регулярных выражений групп в круглых скобках, повторное использование их \1и \2затем с помощью «1» , чтобы заменить последнюю группу.

В этом случае предлагаемое решение также awkбудет хорошим и коротким.

МАЗС
источник
2

это сделает работу:

cat textfiles | cut -d' ' -f-2 | sed 's/$/ 1/'
Виссам Ружула
источник
кошка file.txt | cut -d '' -f-2 | sed 's / $ / 1 /' 646 6 0,5 1 выводит одну строку (последнюю строку) в терминале, но не изменяет file.txt ...
user203269
-1
cat filename | awk -F ' ' '{$3=1; print $0}' > filename
Триллер
источник
Не могли бы вы отредактировать свой пост, чтобы включить больше контекста, почему вы считаете, что это решение?
Kemotep