列が 1 つしかない場合に、ファイルに列を追加するにはどうすればよいでしょうか (sed -i を使用するのが望ましい)?

列が 1 つしかない場合に、ファイルに列を追加するにはどうすればよいでしょうか (sed -i を使用するのが望ましい)?

次のようなデータの列があるとします。

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 とは異なる方法で処理することもあります(「\tsed\tsed-isedsed -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」と同様に「インプレース」編集)「」。

関連情報