
У меня много CSV-файлов, и мне нужно имя каждого конкретного CSV-файла в каждой строке каждого файла.
Исходное содержимое файла abc123.csv
:
ColVal_1;ColVal_2;ColVal_3
ColVal_4;ColVal_5;ColVal_6
Содержимое нового файла:
ColVal_1;ColVal_3;ColVal_3;abc123.csv
ColVal_4;ColVal_5;ColVal_6;abc123.csv
Все CSV-файлы находятся в одном каталоге. Я не хочу указывать имя каждого файла.
решение1
Гораздо проще, легче и быстрее с sed
и xargs
. Здесь sed
используется редактирование на месте, что позволяет избежать дополнительных инструментов оболочки.
$ ls file{1..5}.txt|xargs -I% sed -i 's/$/;%/' %
И вот что получилось.
$ cat file{1..5}.txt
ColVal_1;ColVal_2;ColVal_3;file1.txt
ColVal_4;ColVal_5;ColVal_6;file1.txt
ColVal_1;ColVal_2;ColVal_3;file2.txt
ColVal_4;ColVal_5;ColVal_6;file2.txt
ColVal_1;ColVal_2;ColVal_3;file3.txt
ColVal_4;ColVal_5;ColVal_6;file3.txt
ColVal_1;ColVal_2;ColVal_3;file4.txt
ColVal_4;ColVal_5;ColVal_6;file4.txt
ColVal_1;ColVal_2;ColVal_3;file5.txt
ColVal_4;ColVal_5;ColVal_6;file5.txt
решение2
Используя sed
you можно сделать что-то вроде:
for f in *.csv
do
sed -i 's/$/ '"$f"'/' "$f"
done
Тестирование
Внутри одного из каталогов я создал несколько csv
файлов.
cat csv1.csv
this
is
first
csv
file
##Second CSV file
cat csv2.csv
this
is
second
csv
file
Теперь я выполнил команду, о которой я упомянул выше. После выполнения команды файлы выглядят так, как показано ниже.
cat csv1.csv
this csv1.csv
is csv1.csv
first csv1.csv
csv csv1.csv
file csv1.csv
##Second CSV file
cat csv2.csv
this csv2.csv
is csv2.csv
second csv2.csv
csv csv2.csv
file csv2.csv
Если ты хочешьточки с запятойвы можете просто добавить его в sed
команду перед добавлением имени файла. Измените sed
команду, как показано ниже.
sed -i 's/$/ '";$f"'/' "$f"
Рекомендации
решение3
Как насчет:-
for i in *.csv; do awk '{print $0 ";" FILENAME }' $i > ${i}.tmp ; mv ${i}.tmp ${i} ; done
Вы можете избежать этого, mv
если у вас более поздняя версия, awk
но эта, вероятно, более портативна.
решение4
С perl
:
$ perl -i.bak -ple '$_ .= ";"$ARGV' file.csv
ColVal_1;ColVal_2;ColVal_3;file.csv
ColVal_4;ColVal_5;ColVal_6;file.csv
От perldoc -v '$ARGV'
:
$ARGV Contains the name of the current file when reading from "<>".
Вы можете использовать *.csv
для обработки всех файлов в текущем каталоге. -i.bak
опция редактирования всех файлов на месте и создания резервных файлов с именем *.csv.bak
.