次の形式のデータがあります。
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を追加してください)。
一般に、固定幅フィールドを持つ行を解析するには、FIELDWIDTHS
GNUの特殊変数を参照してください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
を使用できるので、FIELDWIDTHS
2番目の投稿でこれを試すことができます。
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