awk分割と条件付き印刷

awk分割と条件付き印刷

クリーンアップが必要な見苦しいデータファイルがあります。

Date          User Name          Item Id     Title                                                                             Quantity        Price Total Amount
1/1/2015     name1             461064485   Description One Has Spaces                                                                  1     $899.99              $899.99
         Real Name 1                Real Address With Spaces                                                  Location, Real 55555                    555-555-5555

1/2/2015     name2 has spaces 461222501   Description still has spaces                                                                  1     $229.99              $229.99
         Real Name                 Real Address 2 w spaces                                                   Real Location2 55556                    555-555-5556

これまでに最適です。

awk -F "  +" '/^[0-9]\/*[0-9]\// {print $1, $3, $5, $6, $7}' Table.txt > x.txt

ちなみに、ユーザー名が長すぎてプロジェクトIDと1行だけ差が出て壊れました。この場合、$2 は必須 $2+$3 になります。

条件付き分割と印刷を試みました。

awk -F "  +" '/^[0-9]*\/*[0-9]\// {if ( length ($2) >= 15 ) brokenfield=$2 split(brokenfield,subfields," "); print $1, subfields[-1], $4, $5, $6} {if (length ($2) < 15) print $1, $3, $5, $6, $7}' Table.txt > x.txt

動作しますが、すべてを処理するか、2回処理します。

awk -F "  +" '/^[0-9]\/*[0-9]\// {if ( length ($2) >= 15 ) brokenfield=$2 split(brokenfield,subfields," ") print "$1, subfields[-1], $4, $5, $6"; else print "$1, $3, $5, $6, $7" }' Table.txt > x.txt

ただし、行を2回処理したり、すべての行を処理したり(検索アルゴリズムは日付で始まる行のみを処理する必要があるため、理由はわかりません)、印刷ステートメントやelseステートメントでエラーが発生しないと、構文を正しく取得できません。

固定列幅を持つようにprintfにアップグレードする予定ですが、構文を正しく取得できません。

希望の出力(好ましくは固定された熱幅):

1/1/2015    461064485    1    $899.99    $899.99
1/2/2015    461222501    1    $229.99    $229.99 

ベストアンサー1

私はあなたのバージョンをインポートしていくつかの修正をしました:

awk -F "  +" -v'OFS=\t' '/^[0-9]+\/[0-9]+\//{ \
     if(length($2)>=15){ \
           brokenfield=$2; n=split(brokenfield,subfields," "); \
           print $1,subfields[n],$4,$5,$6 \
     } \
     else {print $1,$3,$5,$6,$7} \
}' file

出力:

1/1/2015    461064485   1   $899.99 $899.99
1/2/2015    461222501   1   $229.99 $229.99

いくつかの注意:

  • {}条件文の周りに中かっこを入れることを忘れました。
  • 負の配列のインデックス付けがサポートされていないと思いますawk(少なくとも私のものではありませんgawk)。
  • split配列要素の数を返すので、最後の配列要素のインデックスとして使用できます(n上記の場合)。
  • \t列をうまく整列させるために、出力フィールド区切り文字として使用されます。

おすすめ記事