次のようなデータの列があるとします。
sample123
sample456
samplexyz
次のようにして、2 つの新しい列を簡単に追加できます。
sed -i "s/$/\t1.1\tC/" <file.txt>
今は次のとおりです:
sample123 1.1 C
sample456 1.1 C
samplexyz 1.1 C
ここで、下部に新しいデータを追加するとします。
sample123 1.1 C
sample456 1.1 C
samplexyz 1.1 C
sampleNew1
sampleNew2
sampleNew3
このデータに新しい列を追加しようとすると、すべての行に追加されるので、次のように実行します。
sed -i "s/$/\t1.2\tA/" <file.txt>
次のようになります:
sample123 1.1 C 1.2 A
sample456 1.1 C 1.2 A
samplexyz 1.1 C 1.2 A
sampleNew1 1.2 A
sampleNew2 1.2 A
sampleNew3 1.2 A
最初の列以外に列がない場合に列を追加するにはどうすればよいですか?
答え1
まず現在の行にタブがあるかどうかをテストし、タブがない場合にのみ置換を実行します。
sed -i '/\t/!s/$/\t1.2\tA/' file
ここでは、タブ文字を含まないすべての行を でアドレス指定し/\t/!
、それらの行に置換を適用します。
上記は、GNU がをタブ文字としてsed
認識できることを前提としています。他の実装では の代わりにリテラルのタブ文字を使用する必要があるかもしれません。他の実装では、 を GNU とは異なる方法で処理することもあります(「\t
sed
\t
sed
-i
sed
sed -i (インプレース編集) を使用して移植性を実現するにはどうすればよいですか?()。
使用方法awk
:
awk -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file
これにより、タブ区切りフィールドの数をテストし、フィールドが 1 つしかない場合は、行を印刷する前に新しい 2 番目と 3 番目のフィールドが追加されます。
これでは、ファイルをその場で変更することはできません。そのためには、awk
次のように GNU を使用します。
awk -i inplace -F "\t" 'BEGIN { OFS=FS } NF == 1 { $2 = "1.2"; $3 = "A" }; 1' file
awk
インプレース編集の詳細については、「awk を使用してファイルを永続的に変更するにはどうすればよいでしょうか? (「sed -i」と同様に「インプレース」編集)「」。