次のようなワンライナー ループを使用できます。
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 ...