Объединить имя файла внутри CSV-файла для каждой строки для нескольких CSV-файлов

Объединить имя файла внутри CSV-файла для каждой строки для нескольких CSV-файлов

У меня много 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

Используя sedyou можно сделать что-то вроде:

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"

Рекомендации

http://www.unix.com/unix-for-dummies-questions-and-answers/150545-merge-files-add-file-name-end-each-line.html

решение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.

Связанный контент