2016-07-19 3 views
0

awkを使用して、各データタイプの固定長さが固定されているファイルを処理しようとしていますが、データの実際の長さは最大長よりも短く、データも空であってもかまいません。awkは空のフィールドを分けることができますか?

echo 'a b d e f' | awk -v FIELDWIDTHS="1 1 1 1 1 1" -v OFS=, '{print $1,$2,$3,$4,$5,$6}' 

私は6行のフィールドとその長さを持っている、のは、問題を単純化してみましょうちょうど1であるが、この場合では3番目のフィールドは空です。 期待される出力は

F、

、B、D、Eもしかし、私が得たことは

、B、D、E、F、

である必要があります

空の第3フィールドは正しく区切られません。 誰かがこの問題の解決策を持っていますか?

+2

出力は、意図されたコードとは全く関係がありません。フィールド幅が固定されているとは言えますが、それよりも小さくてもいいとはどういう意味でしょうか。それは固定されているか、または固定されていません。 (おそらく、最大のフィールド幅があることを意味していますか?)とにかく、デリミタがあることとデリミタがないことの両方を指定することはできません。'FIELDWIDTH'を設定すると、以前の' FS'への代入は無視され、逆も同様です。 – rici

+2

私はあなたが 'FS =" FS "'で分割する方法を理解していません。あなたは文字通り 'FS'文字をフィールド区切り文字にするよう依頼しました。これらはデータには表示されないため、1つのフィールドとして扱う必要があります。 – Kaz

+2

私に利用可能なawkのバージョンを使用して結果を再現することはできません。私はmawk(Mikeのawk - あなたはUbuntuにいますか? Mawkは 'FIELDWIDTHS'を無視します。 – John1024

答えて

1

この場合、区切り文字に依存する組み込みフィールドの分割に頼ることはできません。代わりに、列の位置と幅(1,1) (3,1) (5,1) (7,1) (9,1) (11, 1)にごFIELDWIDTHSを変換してからデータを抽出するためにsubstrを使用する必要があります。

$ echo 'a b d e f' | awk '{print substr($0, 3, 1)}' 
b 
$ echo 'a b d e f' | awk '{print substr($0, 5, 1)}' 
0

これはあなたの結果を再現する:それはとして機能しない理由については

$ echo 'a b d e f' | mawk -v FIELDWIDTHS="1 1 1 1 1 1" -v OFS=, '{print $1,$2,$3,$4,$5,$6}' 
a,b,d,e,f, 

あなたは FIELDWIDTHSせずに同じ結果を得ることに注意してください、期待:

$ echo 'a b d e f' | mawk -v OFS=, '{print $1,$2,$3,$4,$5,$6}' 
a,b,d,e,f, 

これはmawk(Mikeのawk)がFIELDWIDTHSを無視するためです。 FIELDWIDTHSが必要な場合は、GNU awkを使用する必要があります。しかし、1にフィールド幅を設定すると、あなたがやりたいことはありませんのでご注意:

$ echo 'a b d e f' | gawk -v FIELDWIDTHS="1 1 1 1 1 1" -v OFS=, '{print $1,$2,$3,$4,$5,$6}' 
a, ,b, , , 

FIELDWIDTHSを使用した場合、GNU awkはフィールドセパレータが存在していることを前提とし、これはあります。あなたが本当にそれをこの方法を行うと、ご希望のフィールド番号を維持したい、あなたは2にフィールド幅を設定する必要がある場合:

$ echo 'a b d e f' | gawk -v FIELDWIDTHS="2 2 2 2 2 2" -v OFS=, '{print $1,$2,$3,$4,$5,$6}' 
a ,b , ,d ,e ,f 

脇に沿ってタグ付けし、余分なスペースから、これはあなたが望んでいたものです。

また、コメントに示唆されているように、フィールドの番号付けを変更する場合は、1文字のフィールド幅を使用することもできます。出力で唯一の奇数フィールドを使用:

$ echo 'a b d e f' | awk -v FIELDWIDTHS="1 1 1 1 1 1 1 1 1 1 1 1" -v OFS=, '{print $1,$3,$5,$7,$9,$11}' 
a,b, ,d,e,f 

これは、不要なスペースが動作し、排除します。

関連する問題