Как заменить содержимое определенного столбца с помощью awk?

31

Дано: в записи 40 столбцов. Я хочу заменить 35-й столбец, чтобы 35-й столбец был заменен содержимым 35-го столбца и символом «$». Что пришло в голову, это что-то вроде:

awk '{print $1" "$2" "...$35"$ "$36...$40}'

Это работает, но потому что это невозможно, когда число столбцов достигает 10 КБ. Мне нужен лучший способ сделать это.

Маркус Торнтон
источник

Ответы:

35

Вы можете сделать так:

awk '$35=$35"$"'
cuonglm
источник
8

Вероятно, есть более эффективные способы сделать это. С этим предостережением:

awk '{$35 = $35"$"; print}' infile > outfile
jasonwryan
источник
3

Если разделитель поля <space>:

sed 's/  */$&/35'
mikeserv
источник
Если разделитель поля неизвестен:sed 's/./$&/35'
Underverse
@ Unververse - я не думаю, что это одно и то же. Это должно предшествовать 35-му символу в строке ввода с символами, $разделенными или нет. Вышеприведенная вещь должна прикрепить 35-е вхождение любого числа символов-разделителей - иными словами, 35-е поле - с символом $- независимо от того, как символы в каждом поле.
mikeserv
Ах, «40 колонок в записи». Я прочитал «35-й столбец» как буквально «35-й символьный столбец текстового файла».
Обратный
3

Чтобы зарезервировать оригинальный Field-Seprator, я сделал это. Колонка, которую я хотел исключить, была номер 12 долларов.

awk -F"\t" '{OFS=FS}{ $12="" ; print   }' infile.txt > outfile.txt

С помощью gawk -i, если у вас есть, вы можете редактировать файл на месте.

зет
источник
1

Если бы возникли проблемы с использованием «одобренных» ответов, он заменил бы не только первый столбец в файле. Я использую эту общую команду:

awk '$[column]="[replace]"' FS=, OFS=, inputfile > outputfile

Где:

  • [column] = столбец, который вы хотите изменить, начиная с 1 (не 0)
  • [replace] = текст, который вы хотите заменить
Джейсон Дж
источник
awk '$1=mktime($1)' FS=, OFS=, oldfile > newfile ... заменил миллион меток за несколько секунд !! :)
roblogic