次のようなワンライナー ループを使用できます。
for f in file1 file2 file3; do sed -i "s/$/\t$f/" $f; done
リスト内の各ファイルに対して、これは sed を使用します 各行の末尾にタブとファイル名を追加します。
説明:
-iの使用sedのフラグ その場で置換を実行し、ファイルを上書きするs/PATTERN/REPLACEMENT/で置換を実行します .この例では、PATTERN は$です 、行の終わり、および REPLACEMENT は\tです (=タブ)、および$fループ変数からのファイル名です。s///シェルが変数を展開できるように、コマンドは二重引用符で囲みます。
paste があるのに、これらの強力なツールをお勧めする理由を教えてください。 コマンド!
$ cat a
A
B
C
D
$ cat b
1
2
3
4
$ paste a b
A 1
B 2
C 3
D 4
ちょっとしたトリックで、 paste を使用できます OPの目的のために。ただし、インプレースのファイルは置き換えられません:
for f in file1 file2 file3; do
paste $f <(yes $f | head -n $(cat $f | wc -l)) > $f.new
done
これにより、各ファイルの最後の列としてそれぞれのファイル名が新しいファイル filename.new に貼り付けられます
awk を使用できます :
awk '{print $0, FILENAME}' file1 file2 file3 ...