![AWK는 괄호 안의 쉼표로 구분된 열의 정확한 값과 일치합니다.](https://linux55.com/image/226838/AWK%EB%8A%94%20%EA%B4%84%ED%98%B8%20%EC%95%88%EC%9D%98%20%EC%89%BC%ED%91%9C%EB%A1%9C%20%EA%B5%AC%EB%B6%84%EB%90%9C%20%EC%97%B4%EC%9D%98%20%E2%80%8B%E2%80%8B%EC%A0%95%ED%99%95%ED%95%9C%20%EA%B0%92%EA%B3%BC%20%EC%9D%BC%EC%B9%98%ED%95%A9%EB%8B%88%EB%8B%A4..png)
따라서 파일의 열에서 정확히 일치하는 숫자를 찾아야 합니다. 입력 파일은 다음과 유사합니다.
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는 귀하의 질문에 표시된 샘플 데이터입니다.