#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. И, конечно, обычное перенаправление стандартного вывода, если вы хотите, чтобы результаты были в файле.