特定の列の空行を値で埋めます。

特定の列の空行を値で埋めます。

次の形式のデータがあります。

2342 1
6473 2
7463 2
3647
2734 1
9343

2番目の列に値がない行は、その位置が空です(つまり、スペース、タブなどはありません)。 2列の空のスロットに「-9」を入れる簡単なコマンドを探しています。

(デフォルトでは、awk列2の行が0でないことを確認し、その場合は「-9」を追加するコマンドです。)

拡張された例(より多くの列を含むデータ、一部には欠落値が含まれています)最後の列にのみ「-9」を追加したい(つまり、他の列は欠落している可能性があります)。

2342 0 12 1
6473   13 2
7463 0 14 2
3647 0  
2734 0    1
9343 0 16 

答え1

データが固定幅列に表示される場合は、次のことができます。

最初のケース:

sed 's/^.\{4\}$/& -9/'

" -9"4文字の行に追加)。

2番目のケース:

sed -e '/.\{11\}/b' -e 's/$/          /;s/\(.\{10\}\).*/\1-9/'

(最大10個のスペースを追加し、11文字未満の行の場合は-9を追加してください)。

一般に、固定幅フィールドを持つ行を解析するには、FIELDWIDTHSGNUの特殊変数を参照してくださいawk

答え2

GNU sedの使用

sed ':;s/^.\{0,9\}$/& /;t;s/^.\{10\}$/&-9/' file

文字数が10文字未満の場合は、テストを使用してスペースを追加してくださいt
その後、行を10文字に変更します。-9.

答え3

awk最初の例を試してみてください。

awk 'NF == 1 { $2 = -9; } 1' file

他の記事で述べたようにgawkを使用できるので、FIELDWIDTHS2番目の投稿でこれを試すことができます。

gawk 'BEGIN { FIELDWIDTHS = "4 1 1 1 2 1 1"} { for (i = 1; i <= NF; i++) { if ($i == "") { if (i == 7) $i = "-9"; else $i = " "; } } printf("%s %s %s %s\n", $1, $3, $5, $7); }' file

答え4

以下を使用できます。

perl -ane 'if(!$F[1]){print $F[0]," -9\n"}else{print $_;}'

このコマンドは、入力内容を1行ずつ読み、2番目の列(空の場合)に「-9」を出力します。

echo "2342 1
6473 2
7463 2
3647
2734 1
9343" | perl -ane 'if(!$F[1]){print $F[0]," -9\n"}else{print $_;}'

2342 1
6473 2
7463 2
3647 -9
2734 1
9343 -9

関連情報