grepするのは難しいです。この番号をどのように分離できますか?

grepするのは難しいです。この番号をどのように分離できますか?

次のファイルの内容があります。

  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 

または:grepsed

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

関連情報