добавление столбца к существующим данным в оболочке - PullRequest
0 голосов
/ 17 марта 2019

У меня есть CSV с тремя заголовками. Я хочу добавить в него дополнительный заголовок с именем "tag".

$ cat TEST1/a.csv
    h1,h2,h3
    a,b,c
    d,e,f
$ awk '{print $0}' TEST1/a.csv
    h1,h2,h3
    a,b,c
    d,e,f
$ awk '{print $0, "tag"}' TEST1/a.csv
     tag2,h3
     tagc
     tagf

Однако, как показано выше, текущий подход дает значение мусора. Как я могу получить вывод, как показано ниже: -

h1,h2,h3,tag
a,b,c,TEST1/a.csv
d,e,f,TEST1/a.csv

Было бы замечательно иметь столбец тегов, содержащий имя файла.

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Видя вывод OP, я считаю, что OP нужен в 1-й строке, для этого требуется, чтобы строка tag была добавлена ​​в заголовок и оставшиеся строки. Необходимо добавить имя файла с путем, если это так, попробуйте выполнить следующее. Я также позаботился об управляющих символах M \r из Input_file в каждой строке.

awk 'BEGIN{OFS=","} {gsub(/\r/,"")} FNR==1{print $0,"tag";next} {print $0,FILENAME}' TEST1/a.csv

Вывод будет следующим.

h1,h2,h3,tag
a,b,c,TEST1/a.csv
d,e,f,TEST1/a.csv


В случае, если вы хотите сначала удалить управляющие символы M в файле Input_file, а затем выполнить команду awk, а затем использовать следующую команду.

tr -d '\r' '' < Input_file > temp_file  &&  mv temp_file Input_file

Затем выполните следующую команду awk.

awk 'BEGIN{OFS=","}FNR==1{print $0,"tag";next} {print $0,FILENAME}' TEST1/a.csv
1 голос
/ 17 марта 2019

Я не уверен, почему вы получаете результаты, которые вы показываете в своей третьей строке awk, и я не совсем уверен, что вы хотите в качестве последнего поля, которое вы добавляете, потому что ваши "ожидаемые результаты" недействительно соответствует коду, который вы предоставили.Если ваша цель состоит в том, чтобы добавить слово «тег» в качестве последнего поля в каждой строке, то может сработать следующее:

awk -F, '{$(NF+1)="tag"} 1' OFS=, TEST1/a.csv

Это имеет следующие биты:

  • -F, устанавливает разделитель полей на запятую, совместимую с вашим CSV.
  • $(NR+1) добавляет новое поле в конец каждой записи.
  • 1 - это сокращение от "«Печать текущей записи».
  • OFS=, устанавливает разделитель выходного поля на запятую.

Существует несколько способов построения одной и той же логики, и все они обеспечат примерноте же результаты.

Устанавливает разделители полей ввода и вывода в блоке BEGIN и использует добавление поля в качестве условия, которое печатает строку.

awk 'BEGIN{FS=OFS=","} $(NF+1)="tag"' TEST1/a.csv

Это обходится безидея записей и просто добавляет текст в каждую строку.

awk '{$0=$0 ",tag"} 1' TEST1/a.csv

и т. д.

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

sed 's/$/,tag/' TEST1/a.csv

IF , с другой стороны, вы хотите добавить имя файла вконец каждой строки и только текст tag в заголовке, вы можете сделать что-то вроде этого:

awk 'NR==1 {$(NF+1)="tag"} NR>1 {$(NF+1)=FILENAME} 1' FS=, OFS=, TEST1/a.csv

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

awk 'NR==1 {$(NF+1)="tag";print} FNR==1 {next} NR>1 {$(NF+1)=FILENAME} 1' FS=, OFS=, file1.csv file2.csv ...

Разница в том, что заголовок изменяется в первой строке и печатаетсяи затем последующие первые строки файлов полностью пропускаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...