多くの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"
引用する
答え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
、 。