2

このようなファイルからすべての数字 (数字のみ) を抽出しようとしています (常に 3 つの '|||')。数字の後に 3 ||| が続いていることを確認してください。

file:
12342|||blah blah
31221|||foo bar
12342|||bar foo

12342,31221,12342だけを取得したい

これまでのところ、

//works
echo "2333|||test" | awk -F  "([^1-9])+\|"  '{print $1}'

// should fail and return none
echo "2333|||test" | awk -F  "([^1-9])+\|+"  '{print $1}'

何か案が?

4

5 に答える 5

3

awk -F'|' '/^[1-9]+\|/ && NF == 4 {print $1}' data.txt

于 2012-09-20T14:03:18.383 に答える
3

こんな感じですか??

awk -F'\\|\\|\\|' '{print $1}'

正確に 3 つの「|||」の前のテキストをキャッチ

grep -Po "^\d+(?=\|\|\|)"

kent$  grep -Po "^\d+(?=\|\|\|)" <<<"2333||tes"

kent$  grep -Po "^\d+(?=\|\|\|)" <<<"2333|||tes"
2333
于 2012-09-20T14:07:41.830 に答える
1

これが拡張grepの代替手段です:

grep -oE '^[0-9]+\|{3}($|[^|])' file | grep -oE '[0-9]+'
于 2012-09-20T14:10:11.477 に答える
1

番号の後に2つのパイプが続く行があり、それらが不要な場合は、GNUを使用している場合はgrep、次を使用できます。

grep -o '^[0-9][0-9]*|||' file | awk -F '|' '{print $1}'

後処理のsed代わりに使用できます。awkこの-oオプションはGNUに固有grepであり、したがって、確実に移植できるわけではありません。

番号の後に4本のパイプがあるラインを拒否する必要がある場合は、さらに努力する必要があります。

grep -E -o '^[0-9]+\|{3}($|[^|])' file | awk -F '|' '{print $1}'

拡張(egrep)正規表現は、行の先頭、1桁以上の数字、3つのパイプ記号の後に、行末または別の非パイプ文字を検索します。

于 2012-09-20T14:07:59.777 に答える
0

どうですか:

awk -F\| '{if (NF >= 4) print $1}' <foo
12342
31221
12342
于 2012-09-20T13:58:01.123 に答える