Как добавить имя строки в файл с разделителями табуляции с заголовком в 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?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
256
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

С авк:

 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*

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

Bing-Hong Huang 09.04.2019 15:53

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

JNevill 09.04.2019 15:57

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

cptPH 09.04.2019 16:09

@JNevil NF - это количество полей, вы имели в виду NR?

oguz ismail 09.04.2019 16:26

@oguzismail ОМГ СПАСИБО!. Очевидно, мне нужно больше кофе. Пишу эту халтуру годами, а я все равно ее напортачу.

JNevill 09.04.2019 16:26

@Bing-HongHuang Я только что обновил, чтобы использовать NR (номер строки) вместо NF (количество полей). Очень жаль эту мисс. Я считаю, что обновленный ответ должен работать для вас как есть.

JNevill 09.04.2019 16:27

@JNevil Спасибо за любезный ответ, это работает, но начинается с AM_2_arp, а не с AM_1_arp.

Bing-Hong Huang 09.04.2019 17:03

@Bing-HongHuang Вы можете просто изменить его с NR на NR-1 за эту секунду print. Я обновлю. (Извините за ожидание)

JNevill 09.04.2019 17:58
Ответ принят как подходящий
awk 'BEGIN {i=0} {print "AM_" i++ "_arp " $0}' <file> | sed 's/AM_0_arp/sim/g'

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

Другие вопросы по теме