Как добавить имя строки в разделенный табуляцией файл с заголовком в Linux

#linux

#linux

Вопрос:

Я имею дело с файлом таблицы с тысячами строк и заголовком. Но я должен добавить имя строки (имя строки представляет номер строки) в каждой строке. Как я мог бы это сделать в Linux?

Я могу сделать это с помощью Excel, но файлов слишком много, поэтому я хотел бы записать команду Linux, чтобы справиться с этим.

Мой файл выглядит следующим образом.

 parameter1 parameter2 paramter3
1.2 1.3 1.4
2.1 2.1 1.5
1.5 1.6 2.1
....
  

И я хотел бы добавить имя строки следующим образом:

 sim parameter1 parameter2 paramter3
AM_1_arp 1.2 1.3 1.4
AM_2_arp 2.1 2.1 1.5
AM_3_arp 1.5 1.6 2.1
....
  

Как я мог бы сделать это с помощью команд Linux?

Ответ №1:

С awk:

  awk 'NR==1{print "sim "$0;next}{print "AM_"NR-1"_arp "$0}' yourfile
  

Это говорит:

  1. Если это первая строка (строка заголовка) NR==1 , то выведите «sim » плюс всю строку: print "sim "$0;
  2. Перейдите к следующей строке, пропуская остальную часть программы next
  3. Для любой другой встречающейся строки выведите «AM » плюс номер строки NR плюс » _arp » , затем всю строку $0 .

Если у вас много файлов в каталоге, для которых вам нужно это сделать, вы можете ссылаться на них с помощью подстановочного знака и перенаправлять вывод внутри awk:

 awk 'NR==1{print "sim "$0 > FILENAME"_out";next}{print "AM_"NR-1"_arp "$0 > FILENAME"_out"}' ./yourfile*
  

Комментарии:

1. Спасибо, я попробовал код, и он печатает имя строки. Но, похоже, NF не работает, все имена строк одинаковы «AM_10_arp»

2. Это странно. Я никогда не сталкивался с тем, что NF не работает. Я рад видеть, что i версия счетчика делает свое дело!

3. Я тоже пробовал эту версию, и по какой-то причине я также получаю странную нумерацию, например: AM_3_arp, AM_3_arp, AM_2_arp, AM_2_arp. Я попробовал это с GNU Awk 3.1.7

4. @JNevill NF — это количество полей, вы имели в виду NR?

5. @oguzismail БОЛЬШОЕ СПАСИБО!. Очевидно, мне нужно больше кофе. Пишу эту блокировку годами, и я все еще ее путаю.

Ответ №2:

 awk 'BEGIN {i=0} {print "AM_" i   "_arp " $0}' <file> | sed 's/AM_0_arp/sim/g'
  

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