为多个 CSV 文件的每一行连接 CSV 文件内的文件名

AvS*_*AvS 7 shell-script csv

我有很多 CSV 文件,我需要每个文件的每一行中每个特定 CSV 文件的文件名。

原始文件内容abc123.csv

ColVal_1;ColVal_2;ColVal_3
ColVal_4;ColVal_5;ColVal_6
Run Code Online (Sandbox Code Playgroud)

新文件内容:

ColVal_1;ColVal_3;ColVal_3;abc123.csv
ColVal_4;ColVal_5;ColVal_6;abc123.csv
Run Code Online (Sandbox Code Playgroud)

所有 CSV 文件都在同一目录中。我不想指定每个文件的名称。

Yaa*_*lie 5

使用sed和更简单、更容易、更快xargs。此处sed使用就地编辑,从而避免了额外的 shell 工具。

$ ls file{1..5}.txt|xargs -I% sed -i 's/$/;%/' %
Run Code Online (Sandbox Code Playgroud)

这是输出。

$ 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
Run Code Online (Sandbox Code Playgroud)


gar*_*Red 0

怎么样:-

for i in *.csv; do awk '{print $0 ";" FILENAME }' $i > ${i}.tmp ; mv ${i}.tmp ${i} ; done
Run Code Online (Sandbox Code Playgroud)

mv如果您有更高版本,则可以避免使用awk,但这可能更便携。