クリーンアップが必要な見苦しいデータファイルがあります。
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
列をうまく整列させるために、出力フィールド区切り文字として使用されます。