1

パイプで区切られた多くの列を持つtxtファイルがあります。列$36が '0'、null、または空白であるかどうかを確認してから、行全体をフィルタリングします。

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", "", "" }'

使用してみlength($36)>0ましたが、空白の値では機能しません。列がこのようなファイルであることがわかります||(間に 2 つのパイプはありません)。

これらの値を特定してフィルターを適用する方法を教えてください。

4

4 に答える 4

1

$36 ~ /^$|0/ゼロまたは空の文字列をフィルタリングするために使用します。

于 2012-06-07T15:39:33.927 に答える
1

次の条件を使用してフィルタリングできます。

awk -F '|' '($36 ~ /^0?$/)' file
于 2012-06-07T15:39:45.673 に答える
1
$36 !~ /^[0 ]*$/

必要なことを行う必要がありますが、エントリの値がゼロの場合 (例: ) は一致しません0.0。そのために、試してください

$36 && $36 !~ /^[0 ]*$/
于 2012-06-07T18:48:27.330 に答える
1

縦方向のスペースを増やすことで、コードを少し単純化できるでしょう。あなたの状態には不可解なコンマがあります。私はそれがおそらくであるべきだと思います&&。示されているように、$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 列以上の実際のケースに適応させることができます。

于 2012-06-07T15:49:06.677 に答える