특정 필드에 문자열이 포함된 행이 없는지 확인하세요.

특정 필드에 문자열이 포함된 행이 없는지 확인하세요.

수천 개의 문자열이 두 번째 열에 있으면 하나씩 검색해야 하고, 그렇지 않으면 행의 두 번째 열에 없는 각 문자열에 대해 작업을 수행해야 합니다.

문서:

line a
line b
line c
line z
line d
line e
line z
line z

파일 2:

line a
line b
line c
line d
line e

내가 시도한 것:

$ awk '{if($2=="z") {c++} } END { if(c==0) {print "no \"z\""} else { print c" \"z\"" }}' file
3 "z"
$ awk '{if($2=="z") {c++} } END { if(c==0) {print "no \"z\""} else { print c" \"z\"" }}' file2
no "z"
$ awk '{if($2=="z") {c++} } END { if(c!=0) {print "no \"z, action will be done\""} }' file
no "z, action will be done"

내 코드가 괜찮은가요, 아니면 단순화/최적화할 수 있나요?

업데이트: @RomanPerekhrest는 귀하의 코드를 참조하고 있습니다. "else"만 처리하거나 "c"에 부정을 추가하는 방법은 무엇입니까? 그리고 나머지는 무시하시겠습니까?

나는 노력 중입니다: (c?: "아니요"),

하지만 작동하지 않습니다.

@αГsнιе, 감사합니다. 드디어 작동하는 스크립트가 생겼습니다.

$ awk -v s="z" '$2==s{ c++ }END{ printf (!c ? NOP : "prepare command1\nprepare command2\nprepare command3\n") }' file
prepare command1
prepare command2
prepare command3
$ awk -v s="z" '$2==s{ c++ }END{ printf (!c ? NOP : "prepare command1\nprepare command2\nprepare command3\n") }' file2
$

또는

$ awk -v s="z" '$2==s{ c++ }END{if(c==0) printf "prepare command1\nprepare command2\nprepare command3\n" }' file2
prepare command1
prepare command2
prepare command3
$ awk -v s="z" '$2==s{ c++ }END{if(c==0) printf "prepare command1\nprepare command2\nprepare command3\n" }' file
$

답변1

통과하다awk동적 변수/매개변수 -v <var>=<value>:

문자열 테스트 케이스 z:

awk -v s="z" '$2==s{ c++ }END{ printf "%s \042%s\042\n", (c? c : "no"), s }' file

산출:

3 "z"

문자열 테스트 케이스 w:

awk -v s="w" '$2==s{ c++ }END{ printf "%s \042%s\042\n", (c? c : "no"), s }' file

산출:

no "w"

답변2

내가 이것을 올바르게 이해했다면 두 번째 열에 특정 알파벳이 있는지 확인하고 싶다면 awk아래 스크립트를 사용해 보십시오. 이 스크립트는 어떤 것이 있고 해당 개수가 있는지, 어떤 것이 "NOT FOUND!"메모가 없는지 보고합니다.

awk -v alphabet="$(printf "%s" {a..z})" 'BEGIN{ split(alphabet, arr, "") }
    { chrs[$2]++ } END{ for(y in chrs) for(x in arr)
        { if(arr[x] in chrs) {print y, chrs[y]; delete arr[x]; break }
            else{ print arr[x]" NOT FOUND!"; delete arr[x] }
        }
}' infile

산출:

w 1
z 3
a 1
b 1
c 1
f NOT FOUND!
g NOT FOUND!
h NOT FOUND!
i NOT FOUND!
j NOT FOUND!
k NOT FOUND!
l NOT FOUND!
m NOT FOUND!
n NOT FOUND!
o NOT FOUND!
p NOT FOUND!
q NOT FOUND!
r NOT FOUND!
s NOT FOUND!
t NOT FOUND!
u NOT FOUND!
v NOT FOUND!
d 1
x NOT FOUND!
y NOT FOUND!
e 1

관련 정보