Заменить все значения в одном столбце на 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  

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

Ответы:


16
awk '{print $1, $2, "1"}' inputfile

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
  • [^ ]*$ любой символ, кроме пробела, до конца строки.

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.