1

フィールドセパレータが\tであるレコードリストとして構造化されたファイルがあります。2 番目のフィールドが 1 から 9 までの数字であるレコードのみを抽出したいのですが、awk スクリプトが機能しません。awkスクリプトは

cat file |awk -v FS="\t" '$2 ~ /[0-9]{1}/ {print $0;}'

またはこれ

cat file |awk -v FS="\t" '$2 ~ /.{1}/ {print $0;}'  #because the second fields of my file have  all second fields as number

これらのスクリプトが機能しないのはなぜですか? 正規表現は良い正規表現ではありませんか?

4

2 に答える 2

1

アップデート

interval を使用しても、 が単一の数値に一致するため、{1}フィールドに一致することになります。あなたが本当に使いたいのはアンカーであり、インターバルは忘れてください:232

awk '$2 ~ /^[0-9]$/{print}' FS="\t" file

問題は interval の使用です{1}awkバージョン 4 未満は間隔をサポートしていません。 gawk一方、次のフラグを追加すると、次のようになります。--re-interval

これを試して:

awk --re-interval '$2 ~ /[0-9]{1}/{print}' FS="\t" file

その他の注意事項:

  1. FSを必要とせずに最後に割り当てることができるような組み込み変数-v
  2. それがデフォルトの動作であるため、print代わりに使用できますprint $0
  3. の無駄使いcatawkファイルを引数として取ることができます。代わりにそれを使用してください
于 2012-01-22T23:47:56.530 に答える
1

2 番目のフィールドが 1 桁の数字であることを確認したい場合は、正規表現は必要ありません。

awk '1 <= $2 && $2 <= 9 {print}'
于 2012-01-23T03:02:13.220 に答える