在多個 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使用就地編輯,從而避免額外的 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"

參考

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

相關內容