AWK에서 tsv 파일의 다중 교체 [REFACTOR]

AWK에서 tsv 파일의 다중 교체 [REFACTOR]

내 파일에 다음 줄이 있습니다 file.sh.

awk '$2 != "$ID1$"' myfile2.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID2$"' myfile3.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID3$"' myfile3.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID4$"' myfile3.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID5$"' myfile3.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID6$"' myfile3.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID7$"' myfile3.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID8$"' myfile3.tsv > output && mv output myfile3.tsv
awk '$2 != "$ID9$"' myfile3.tsv > output && mv output myfile4.tsv
...

이것은 매력적으로 작동하지만 몇 개의 행(+600)이 있으므로 다음과 같이 보이도록 리팩터링해야 합니다.

awk '$2 != "$ID1$", $2 != "$ID2$", $2 != "$ID3$" ...' myfile3.tsv > output && mv output myfile3.tsv

모든 것을 시도했지만 올바른 구문의 키를 찾을 수 없습니다.

미리 감사드립니다.

답변1

원하는 것을 달성하는 한 가지 방법은 다음과 같습니다. 필요한 수의 매개변수를 얻으려면 lim 변수를 입력합니다.

awk -F '\t' -v lim=9 '
  BEGIN {
    OFS = FS
    for (i=1; i<=lim; i++) a["$ID"  i "$"]
  }
  $2 in a {next}
1'  yourfile.tsv

답변2

이 경우 쉼표 연산자가 무엇을 하기를 기대하며, 매뉴얼에 따라 무엇을 합니까?

모든 것을 시도했다면 AND 연산자를 사용하여 AND 조건을 생성해 보셨나요?

awk '$2 != "$ID1$" && $2 != "$ID2$"' myfile3.tsv > output

뭔가 멋진 것을 원한다면 awk에서 배열을 사용할 수 있습니다.

검색어가 줄의 다른 곳에 나타나지 않는 경우 이 기능을 사용할 수 있습니다 grep -v.

답변3

ID를 생성할 수 없고 수동으로 나열해야 하는 경우 다음과 같습니다.

awk -v ids='$ID1$ $ID2$' '
    BEGIN { split(ids,tmp); for (i in tmp) idarr[tmp[i]] }
    !($2 in idarr)
' file

또는 다음 이름의 파일에서 별도의 줄에 저장되는 경우 ids:

awk '
    NR==FNR { idarr[$1]; next }
    !($2 in idarr)
' ids file

또는 해시 조회로 끝나는 유사한 방법도 있습니다.

관련 정보