awk: フィールド長の確認

awk: フィールド長の確認

存在するawk。私はSolaris 10を使用しているので、以前のバージョンかもしれませんawk。少なくとも特定の入力については、動作する基本的な冗談を思い出しました。

awk -F\; '$3 ~ /[ ]*...............................*/' file.csv 

区切り文字の周りにスペースがある場合とない場合があるため、正規表現[ ]*の一部です。

〜したい.ドット文字を30回印刷しないでください。、以下を試しました。

awk -F\; '$3 ~ /[ ]*.\{30\}.*/{print $3}' file.csv

結果は返されませんでした。何らかの方法で役立つ場合は使用していますksh88

連続30点を入力しない最良の方法は何ですか?

答え1

awk -F\; 'length($3) == 30' file.csv

図に示すように、スペースがある場合は、スペースをフィールド区切り文字の一部として作成して削除できます。

awk -F' *; *' 'length($3)==30' file.csv

答え2

GNU awk は間隔式と常に一致しません。ここに問題があります。{N}文法が必要です。 POSIX準拠のawksは-W re-intervalこの構文を有効にすることができるので、試してみてください。しかし、空の構文をまったく受け入れないawkのSystem V派生バージョンを実行している可能性があります。

最良の選択肢は、FSを正規表現に設定することです。これにより、セミコロンの周囲のスペースをフィールド区切り文字の一部として扱うことができます。これは古いawk機能であり、現在使用されているawkでサポートされています。スペースを削除した後、ドットでいっぱいの正規表現を省略し、length() 関数を使用してフィールドの長さを確認できます。

awk -F"[ ]*;[ ]*" 'length($3) == 30 { print $3 }' file.csv

答え3

私が正しく理解した場合は、周囲のスペースを含めずに30文字以上の行に3番目のフィールドを印刷しようとしています。

awk -F ';' 'match($3, "[^ ].*[^ ]") && RLENGTH >= 30'

関連情報