複数の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

sedの操作を実行できます。

for f in *.csv
do
 sed -i 's/$/ '"$f"'/' "$f"
done

テスト

ディレクトリの1つに複数の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、 。

関連情報