AWK는 괄호 안의 쉼표로 구분된 열의 ​​정확한 값과 일치합니다.

AWK는 괄호 안의 쉼표로 구분된 열의 ​​정확한 값과 일치합니다.

따라서 파일의 열에서 정확히 일치하는 숫자를 찾아야 합니다. 입력 파일은 다음과 유사합니다.

33.xx  1111  0 0 0 some+text 12:12:12.9999  9999:090909 88 [11,22,33] 2020-12-12 12:12:12.1234
24.1b  1131  0 0 0 some+text1 12:12:12.9999  9999:090909 88 [1,25,22] 2020-12-12 12:12:12.1234
1.52  1211  0 0 0 some+text3 12:12:12.9999  9999:090909 88 [22,2,123] 2020-12-12 12:12:12.1234

22괄호 사이의 값 중 하나인 행만 일치시켜 첫 번째 열을 출력하고 싶습니다 .

답변1

awk를 사용하십시오.

$ awk '$(NF-2) ~ /[[,]22[],]/{print $1}' file
33.xx
24.1b
1.52

밝고 화창한 날에 일치하는 항목을 찾는 상황 이상을 포함하는 좀 더 포괄적인 예제 입력을 통해 일치 항목을 찾을 것으로 예상합니다.

$ cat file
33.xx  1111  0 0 0 some+text 12:12:12.9999  9999:090909 88 [11,22,33] 2020-12-12 12:12:12.1234
24.1b  1131  0 0 0 some+text1 12:12:12.9999  9999:090909 88 [1,25,22] 2020-12-12 12:12:12.1234
1.52  1211  0 0 0 some+text3 12:12:12.9999  9999:090909 88 [22,2,123] 2020-12-12 12:12:12.123
1.good  1111  0 0 0 some+text 12:12:12.9999  9999:090909 88 [22] 2020-12-12 12:12:12.1234
2.good  1111  0 0 0 some+text 12:12:12.9999  9999:090909 88 [11,22] 2020-12-12 12:12:12.1234
3.good  1111  0 0 0 some+text 12:12:12.9999  9999:090909 88 [22,33] 2020-12-12 12:12:12.1234
4.good  1111  0 0 0 foo bar 12:12:12.9999  9999:090909 88 [11,22,33] 2020-12-12 12:12:12.1234
5.bad  1111  0 0 0 some+text 12:12:12.9999  9999:090909 88 [11,33] 2020-12-12 12:12:12.1234
6.bad  1111  0 0 0 some+text 12:12:12.9999  9999:090909 88 [11,222,33] 2020-12-12 12:12:12.1234
7.bad  1111  0 0 0 this is [22] fun 12:12:12.9999  9999:090909 88 [11,33] 2020-12-12 12:12:12.1234

이것이 생성하는 출력은 다음과 같습니다. 아마도 OP가 기대했던 것일 것입니다.

$ awk '$(NF-2) ~ /[[,]22[],]/{print $1}' file
33.xx
24.1b
1.52
1.good
2.good
3.good
4.good

저는 $(NF-2)각 줄의 시작 부분이 아닌 끝 부분부터 필드를 계산하는 데 익숙하므로 some+text실제로 포함된 내용에 관계없이 작동합니다. 공백이 포함되지 않으면 대신 some+text사용할 수 있습니다 .$10$(NF-2)

답변2

사용 pcregrep:

$ pcregrep -o1 '(\S*).*(\[(\d+,)*22(,\d+)*])' file

사용 awk:

다음 명령을 사용할 수 있습니다:

$ nawk '$(NF-2) ~ /\[([[:alnum:]]*,)*22(,[[:alnum:]]*)*]/{print $1}' file

알파벳 문자가 필요하지 않은 경우 이 명령을 변경할 수 있습니다.

$ awk '$(NF-2) ~ /\[([[:digit:]]*,)*22(,[[:digit:]]*)*]/{print $1}' file

괄호 안의 값이 누락되는 것을 원하지 않으면 다음을 사용할 수 있습니다.

$ awk '$(NF-2) ~ /\[([[:digit:]]+,)*22(,[[:digit:]]+)*]/{print $1}' file

답변3

다음과 같은 작업이 수행됩니다.

awk -F"[][]" '$2~"22"{print }' <input file>

여기서 구분 기호는 [또는 로 설정되어 ]있으며 두 번째 필드에 22가 포함되어 있는지 확인합니다.

확인하려는 값이 정확히 22인 경우 다음과 같은 것을 사용할 수 있습니다.

awk -F"[][]" '$2~",22" || $2~"22,"{print }' <input file>

절대적인 엄격함을 찾고 있다면 다음과 같은 것을 사용할 수 있습니다.

awk -F"[][]" '{split($2,a,","); for (i in a) if(a[i]==22) {split($1,b," ");print b[1];break} }'   <input file>

답변4

나는 당신이 원하는 일치 항목이 있는 행의 첫 번째 열에만 관심이 있다고 생각합니다. 이 경우 grep을 사용하는 방법은 다음과 같습니다.

$ egrep '\[.*\,22,|\[22\,|\,22\]' infile.txt | cut  -d' ' -f1
33.xx
24.1b
1.52

infile.txt는 귀하의 질문에 표시된 샘플 데이터입니다.

관련 정보