我有很多 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
使用就地编辑,从而避免额外的 shell 工具。
$ 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
你可以做类似的事情,
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
。