Добавление нескольких csv-файлов в один csv-файл с помощью сценариев командной строки

#shell

#оболочка

Вопрос:

Я пытаюсь добавить несколько csv-файлов в один. Как я могу улучшить приведенный ниже скрипт, чтобы добавить дополнительный столбец. Давайте назовем это «tag». Значениями в теге должно быть имя файла, из которого была добавлена запись.

 flag=0
for f in $@/*.csv;

do
k=$(wc -l<"$f" )
if [ $flag -eq 0 ];
then
  head -n $k "$f" > out.csv
  flag=1
else

  tail -n  2 "$f" >> out.csv

fi

done
  

Используя подход @ Shawn, приведенный ниже, я получаю это:-

         $ cat TEST1/a.csv 
    h1,h2,h3 
    a,b,c 
    d,e,f 
    $ cat TEST1/b.csv 
    h1,h2,h3 
    1,2,3 
    4,5,6 
    $ awk 'NR == 1 { print $0 ",tag"; next } 
FNR == 1 { next } 
{ print $0 "," FILENAME }' TEST1/a.csv TEST1/b.csv 
    ,tag2,h3 
    ,TEST1/a.csv 
    ,TEST1/a.csv 
    ,TEST1/b.csv 
    ,TEST1/b.csv
  

Ответ №1:

Что-то вроде этого с использованием awk:

 $ cat a.csv  
header1,header2,header3
a,b,c
d,e,f
$ cat b.csv
header1,header2,header3
1,2,3
4,5,6
$ awk 'NR == 1 { print $0 ",tag"; next }
       FNR == 1 { next }
       { print $0 "," FILENAME }' a.csv b.csv
header1,header2,header3,tag
a,b,c,a.csv
d,e,f,a.csv
1,2,3,b.csv
4,5,6,b.csv
  

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

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

1. Как мы можем использовать приведенную выше команду в цикле, чтобы она перебирала все файлы в папке?

2. @itthrill Зачем вам использовать цикл, выходящий за рамки неявных в awk? awk '...' *.csv

3. И, конечно, обычное перенаправление стандартного вывода, если вы хотите, чтобы результаты были в файле.