![AWK에서 tsv 파일의 다중 교체 [REFACTOR]](https://linux55.com/image/189747/AWK%EC%97%90%EC%84%9C%20tsv%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EB%8B%A4%EC%A4%91%20%EA%B5%90%EC%B2%B4%20%5BREFACTOR%5D.png)
내 파일에 다음 줄이 있습니다 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
또는 해시 조회로 끝나는 유사한 방법도 있습니다.