다음 파일 내용이 있습니다.
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
두 번째 필드가 있는 줄에서 첫 번째 필드를 가져옵니다 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의 추악한 한 줄 설명은 다음과 같습니다 72,96
.
awk 'function f(n) { return ($2 ~ "(^|,)" n "(,|$)") }
f(60) && ! (f(72) && f(96)) {print NR, $1}' < file
이 함수는 두 번째 필드의 숫자 목록 내에 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
쉼표를 사용하여 공백으로 구분된 두 번째 필드를 구분할 수 있습니다 . 필드를 분할한 결과가 여러 개의 단일 값인 경우 의미가 없습니다. 그렇지 않고 60인 경우 공백으로 구분된 첫 번째 필드를 인쇄합니다.
awk 'split($2, a, ",") == 1 && $2 == 60 { print $1 }' <file
주어진 예제 데이터의 경우 가 인쇄됩니다 7
.