web-dev-qa-db-ja.com

awkを使用してフィールド長を確認する

3つのフィールドのファイルがあります。

123710337783,351898014413150,123028040249634
123710337785,352934028758390,123028040109275

フィールドが次の長さを満たしていることを確認する必要があります。

Field 1 = 12
Field 2 = 15 or 16
Field 3 = 15

これを実行するとエラーが発生します:

awk -F, '{if(length($2) == 15 ) || length($2) == 16) && length($1) == 12 && length($3)) == 15) print  }'

手伝ってください。

バーニー

22
bernie

すべてのブラケットが一致していません。 「if」式は括弧内に含める必要があります。つまり、

if (X == 45) ...
if ((X == 45) || (Y == 23)) ...

あなたはこれを持っていない、あなたは開き括弧よりも多くの閉じ括弧を持っている-したがって、バランスもオフです。括弧を数えると(開いた場合は増分、閉じた場合は減分)、0ではなく合計-3になるため、開いているよりも3つのブラケットを閉じます。

            1      2  1       0          1  0     -1          0 -1                0 -1 -2     -3
awk -F, '{if(length($2) == 15 ) || length($2) == 16) && length($1) == 12 && length($3)  ) == 15) print  }'

だから、代わりにこれを試してみてください。

awk -F, '{ if (((length($2) == 15 ) || length($2) == 16) && (length($1) == 12 && length($3) == 15)) print }'
18
Chris J

印刷するだけなら、式をデフォルトの条件に設定します。

awk -F, 'length($1)==12 && (length($2)==15 || length($2)==16) && length($3)==15'

入力ファイル内でこの基準を満たさない行を除外しようとしている場合:

awk -F, '
    length($1)!=12 || length($2)<15 || length($2)>16 || length($3)!=15) {next}
    # do other stuff...
'
8
glenn jackman

条件に括弧の不一致/不均衡があります。試してください:

{ if ((length($2) == 15 || length($2) == 16) && length($1) == 12 && length($3) == 15) print; }
5