縦方向のスペースを増やすことで、コードを少し単純化できるでしょう。あなたの状態には不可解なコンマがあります。私はそれがおそらくであるべきだと思います&&
。示されているように、$0
アクションのない条件 (つまり print のデフォルト アクションがある) と、条件のないアクション (すべての行のデフォルトの一致がある) があります。
awk -F"|" 'BEGIN{OFS="|"}
NR != 1 && $3 = "A" && $36 != 0 && length($36) > 0 {
print $1, $81, $3, $2, $21, $22, $6, $19, $20, $25, $26, $29, $30,
$31, $33, $34, $36, $38, "", $39, "", "", $40, $42, "rrr", "", ""
}'
{
は条件と同じ行にあることに注意してください。個人的には、おそらく次のように書きます。
awk -F"|" 'BEGIN{OFS="|"}
{
if (NR != 1 && $3 = "A" && $36 != 0 && length($36) > 0)
{
print $1, $81, $3, $2, $21, $22, $6, $19, $20, $25, $26, $29, $30,
$31, $33, $34, $36, $38, "", $39, "", "", $40, $42, "rrr", "", ""
}
}'
$3
これまでのところ、それがデータの最初の行ではない場合、がA
である場合、$36
が空でもゼロでもない場合に印刷することを前提としています。「フィルタリングしたい」と言いますが、フィルタリングされた行を含めるか除外するかを説明していません。フィールド 36 が空の行のみに関心がある場合は、条件を次のように単純化できます。
awk -F"|" 'BEGIN{OFS="|"}
{
if (NR != 1 && $3 = "A" && $36 != "")
{
print $1, $81, $3, $2, $21, $22, $6, $19, $20, $25, $26, $29, $30,
$31, $33, $34, $36, $38, "", $39, "", "", $40, $42, "rrr", "", ""
}
}'
length($36) > 0
または、代わりに使用することもできます。このコンテキストでは同等です。
あなたがサンプル データを提供しておらず、パイプで区切られた 81 個以上のフィールドを持つレコードがどのように見えるかを調べるのが面倒なため、このコードをテストすることはできません。質問するときは、コードを単純化する必要があります。たとえば、例では 4 列で間に合わせてから、小規模なソリューションを 80 列以上の実際のケースに適応させることができます。