#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
Это говорит:
- Если это первая строка (строка заголовка)
NR==1
, то выведите «sim » плюс всю строку:print "sim "$0;
- Перейдите к следующей строке, пропуская остальную часть программы
next
- Для любой другой встречающейся строки выведите «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 для заголовка.