次のファイルの内容があります。
63 41,3,11,12
1 31,60,72,96
7 41,3,31,14,15,68,59,60
7 60,72,96
7 60
1 41,3,31,31,14,15,68,59,60
60 41,3,115,12,13,66,96
1 41,3,11,12,13,66,96
「60」の前に「7」をgrepする必要があります(「60」の後に「72,96」が来ない)。
答え1
コメントに基づいて修正された例
$ cat ip.txt
7 60,72,96
7 60
3 601
2 60,72,962
5 60,3
43 60
3 52360
$ grep -oP '^\h*\K\d+(?=\h+60\h*$)' ip.txt
7
43
-oP
一致する部分だけを印刷してPCREを使用してください。^\h*\K
行の先頭の空白文字を無視\d+
印刷する数量(?=\h+60\h*$)
後に空白文字が続く場合にのみ、60
行末まで空白を選択できます。
または、awk
フィールドベースの処理にのみ使用されます。)
答え2
2番目のフィールドがある行から最初のフィールドを取得します60
(GNU awkだけでなくすべてのawkでも機能する必要があります)。
awk '$2 == "60" {print $1}' < file
または:grep
sed
grep -E '^[[:space:]]*[[:digit:]]+[[:space:]]+60[[:space:]]*$' < file |
sed -e 's/^[[:space:]]*//' -e 's/[[:space:]].*//'
60
対応するペアを含む行を含むが正確に除外したい一般的なケースのawkの醜い1行の説明は次のとおりです72,96
。
awk 'function f(n) { return ($2 ~ "(^|,)" n "(,|$)") }
f(60) && ! (f(72) && f(96)) {print NR, $1}' < file
この関数は、2番目のフィールドの数値リスト内にf(n)
あることを確認しますn
(数字がカンマまたはフィールドの先頭/末尾で区切られていると仮定)。その後、それが存在することを確認し、60
ペアが72,96
存在しません。出力は行番号(NR
)と最初のフィールドですが、必要でない場合は行番号を簡単に削除できます。
答え3
努力する:
$ cat infile
63 41,3,11,12
1 31,60,72,96
7 41,3,31,14,15,68,59,60
7 60,72,96
7 60
1 41,3,31,31,14,15,68,59,60
60 41,3,115,12,13,66,96
1 41,3,11,12,13,66,96 7 60,72,96
7 60
3 601
2 60,72,962
5 60,3
43 60
3 52360
$ grep -oP '^\s*[0-9]+(?= 60\s*$)' infile
7
7
43
説明する:
grep -P '^ # grep from start of line
\s* # followed by optional spaces
[0-9]+ # followed by some decimal digits
(?= 60\s*$) # That have a <space>60<space(s)><end of line>
# but do not capture the 60.
' infile
答え4
awk
カンマを使用して、スペースで区切られた2番目のフィールドを区切ることができます。フィールドを分割した結果が複数の単一値の場合は意味がありません。それ以外の場合は60の場合は、スペースで区切られた最初のフィールドを印刷します。
awk 'split($2, a, ",") == 1 && $2 == 60 { print $1 }' <file
与えられたサンプルデータの場合は印刷されます7
。