2

猫エラー00

4  0    375
4 2001   21
4 2002   20

猫エラー01

4 0      465
4 2001   12
4 2002   40
4 2016   1

以下のように出力したい

4 0      375   465
4 2001   21    12
4 2002   20    20
4 2016   -     1

私は以下のクエリを使用しています。ここでの問題は、スペースが来ているため、2 つのフィールドの grep を処理できないことです。これを取り除く方法を提案してください。

keylist=$(awk '{print $1,$2'} Error0[0-1] | sort | uniq)
for key in ${keylist} ; do
echo ${key}
        val_a=$(grep "^${key}" Error00 | awk  '{print $3}') ;val_a=${val_a:---}
        val_b=$(grep "^${key}" Error01 | awk '{print $1,$2}') ; val_b=${val_b:---    --}
        echo $key  ${val_a} >>testreport
done

以下のように出力を取得しています

4       375   465
0
4       21    12
2001
4       20    20
2002
4       -     1
2016
4

2 に答える 2

4

1awkつのライナーでこれを簡単に処理できます。

awk 'FNR==NR{a[$1,$2]=$3;next}{print $1,$2,(a[$1,$2]?a[$1,$2]:"-"),$3}' err0 err1
4 0 375 465
4 2001 21 12
4 2002 20 40
4 2016 - 1

フォーマットされた出力の場合、printfの代わりに使用できますprintジョナサン・レフラーが提案するように:

printf "%s %-6s %-6s %s\n",$1,$2,(a[$1,$2]?a[$1,$2]:"-"),$3
4 0      375    465
4 2001   21     12
4 2002   20     40
4 2016   -      1

ただし、一般的な解決策はcolumn -t、適切なテーブル出力に使用することです。

awk '{....}' err0 err1 | column -t
4  0     375  465
4  2001  21   12
4  2002  20   40
4  2016  -    1
于 2013-09-20T08:56:48.283 に答える
1

grepは、この仕事に適したツールではありません。awkまたは Perl (または Python、または …) で遊ぶか、または を使用できますjoin。ただし、join一度に 1 つの列でのみ結合し、2 つの列で結合する必要があるようです。そのため、データを操作してjoin. 私はあなたが使用していると仮定しようとしbashているので、プロセスの代替が利用可能です. なくてもジョブを実行できますが、手間がかかり、一時ファイル (およびそれらをクリーンアップするためのトラップなど) が含まれます。

結合の鍵は、最初の 2 つの列の間の空白をコロン (またはその他の便利な文字 — control-A も正常に機能します) に置き換えてから、列 1 のファイルを置換文字で結合することです。入力はソートする必要があります。出力では、コロンを空白に置き換える必要があります。

$ join -o 0,1.2,2.2 -a 1 -a 2 -e '-' \
>     <(sed 's/  */:/' Error00 | sort) \
>     <(sed 's/  */:/' Error01 | sort) |
> sed 's/:/ /'
4 0 375 465
4 2001 21 12
4 2002 20 40
4 2016 - 1
$

この's/ */:/'操作は、1 つ以上のブランクの最初のシーケンスをコロンに置き換えます。入力データには、 の最初の行の 4 と 0 の間に 2 つの空白がありError00ます。への入力joinは、結合フィールド (ここでは最初のフィールド) のソート順でなければなりません。出力は結合フィールドであり、 の 2 番目の列Error00と の 2 番目の列ですError01(最初の 2 つの列がコロンで結合された後の 2 番目の列を意味することを思い出してください)。最初のファイルに一致しない行がある場合は、出力行 ( -a 1) を生成します。2 番目のファイルについても同様です。不足しているフィールドについては、ダッシュ ( -e '-') を挿入します。最後sedに、追加されたコロンを削除します。

データをフォーマットしたい場合は、 にパイプしますawk

$ join -o 0,1.2,2.2 -a 1 -a 2 -e '-' \
>     <(sed 's/  */:/' Error00 | sort) \
>     <(sed 's/  */:/' Error01 | sort) |
> sed 's/:/ /' |
> awk '{printf("%s %-6s %-6s %s\n", $1, $2, $3, $4)}'
4 0      375    465
4 2001   21     12
4 2002   20     40
4 2016   -      1
$
于 2013-09-20T06:53:49.137 に答える