4

RHEL 上の私の GAWK バージョンは次のとおりです。

gawk-3.1.5-15.el5

最初のフィールドにすべての数字がある場合に行を印刷したかった (特殊文字はなく、スペースも考慮されていない)

Example:

echo "123456789012345,3" | awk -F, '{if ($1 ~ /^[[:digit:]]$/)  print $0}'

Output:
Nothing

Expected Output:
123456789012345,3

ここで何がうまくいかないのですか?私の AWK バージョンは GNU 文字クラスを認識しませんか? 親切に助けて

4

3 に答える 3

5

[[:digit:]]文字クラスの複数の数字に一致するには+、 を追加します。これは、 の 1 つ以上の数字に一致することを意味し$1ます。

echo "123456789012345,3" | awk -F, '{if ($1 ~ /^([[:digit:]]+)$/)  print $0}'
123456789012345,3

これはあなたの要件を満たしています。

より慣用的な方法(コメントから示唆されているように)は、をドロップprintし、行に直接一致して印刷することです。

echo "123456789012345,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'
123456789012345,3

同じことを示すいくつかの例、

echo "a1,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'

(と)

echo "aa,3" | awk -F, '$1 ~ /^([[:digit:]]+)$/'

要件ごとに出力を生成しないでください。

POSIX数字の厳密な長さチェックを行う別の準拠した方法は、以下のようなもので実現できます。ここで{3}、 は一致する長さを示します。

echo "123,3" |  awk --posix -F, '$1 ~ /^[0-9]{3}$/'
123,3

(と)

echo "12,3" |  awk --posix -F, '$1 ~ /^[0-9]{3}$/'

出力を生成しません。

比較的新しいバージョンのbashシェルを使用している場合、上記のように文字クラスを使用してネイティブregEx演算子をサポートしています。~POSIX

#!/bin/bash

while IFS=',' read -r row1 row2
do
   [[ $row1 =~ ^([[:digit:]]+)$ ]] && printf "%s,%s\n" "$row1" "$row2"
done < file

入力ファイルの場合file

$ cat file
122,12
a1,22
aa,12

スクリプトは、

$ bash script.sh
122,12

これは機能しbash regExますが、文字列操作を使用した比較的簡単な方法は遅くなる可能性があります

while IFS=',' read -r row1 row2
do
   [[ -z "${row1//[0-9]/}" ]] && printf "%s,%s\n" "$row1" "$row2"
done < file

"${row1//[0-9]/}"は行からすべての数字を削除し、変数に他の文字が残っていない場合にのみ条件が true になります。

于 2016-12-23T07:39:04.570 に答える
3

ここでは、パターンに一致するすべての行を印刷しています。これがまさに の目的ですgrep。@Inian はコードの何が問題なのかを見事に伝えたのでgrep、コマンドとまったく同じawk(はるかに高速ではありますが)別のベースの回答を提案させてください。

grep -E '^[[:digit:]]+,'
于 2016-12-23T08:45:54.473 に答える
2

以下をお試しいただき、これが役立つかどうかお知らせください。

echo "123456789012345,3" | awk -F, '{if ($1 ~ /^([[:digit:]]*)$/)  print $0}'

編集:上記のコードは、次のように少し減らすこともできます。

echo "123456789012345,3" | awk -F, '($1 ~ /^[[:digit:]]*$/)'
于 2016-12-23T07:42:21.537 に答える