이 명령을 내린 후 나는 이렇게 됩니다
awk '{print $7}' myfile.txt
/myfolder/1001.AB.txt.gz,/myfolder/1001.CD.txt.gz
/myfolder/1011.filtered.txt,/myfolder/1011.AB.txt.gz,myfolder/1011.CD.txt.gz
/myfolder/1003.AB.txt.gz,/myfolder/1003.CD.txt.gz
/myfolder/1024.merged.txt.gz,/myfolder/1024.filtered.txt,/myfolder/1024.AB.txt.gz,/myfolder/1024.CD.txt.gz
/myfolder/1014.merged.txt.gz
/myfolder/1020.AB.txt.gz,/myfolder/1020.CD.txt.gz
/myfolder/1021.filtered.AB.txt.gz,/myfolder/1021.merged.CD.txt.gz
/myfolder/1031.filtered.txt
하지만 이렇게 우선순위에 따라 값을 유지하고 싶습니다. 우선순위는 [1] merged.txt.gz
, [2] AB.txt.gz
& CD.txt.gz
, [3] 이고 다른 값은 제거합니다.filtered.txt
[2]AB.txt.gz&disc.txt.gz두 가지 값을 유지
산출
/myfolder/1001.AB.txt.gz,/myfolder/1001.CD.txt.gz
/myfolder/1011.AB.txt.gz,/myfolder/1011.CD.txt.gz
/myfolder/1003.AB.txt.gz,/myfolder/1003.CD.txt.gz
/myfolder/1024.merged.txt.gz
/myfolder/1014.merged.txt.gz
/myfolder/1020.AB.txt.gz,/myfolder/1020.txt.CD.gz
/myfolder/1021.merged.txt.gz
/myfolder/1031.filtered.txt
답변1
sed 's/.*<TAB>//;/merged.txt.gz/!b2
s/,*[^,]*AB.txt.gz,*//g;s/,*[^,]*CD.txt.gz,*//g
:1
s/,*[^,]*filtered[^,]*,*//g;b
:2
/AB.txt.gz/b1
/CD.txt.gz/b1' myfile.txt
작동 방식:
- 마지막 탭으로 구분된 열만 필요하므로 행간은
s/.*
TAB//
마지막 탭까지 포함하여 모든 항목을 제거합니다. 셸에서 TAB 앞에 ctrl-v를 입력해야 할 수도 있습니다. 또는 GNU의 경우 대신 리터럴 TAB을sed
사용하십시오\t
. - 해당 줄에 있으면
merged.txt.gz
스크립트의 두 번째 줄은 and 항목을 삭제하고, 네 번째 줄은 and 항목을 삭제한 다음, mark()로의 점프가 수행되지 않으므로 mark가 없으면 스크립트 끝으로 점프합니다.2
b2
!
AB
CD
filtered
b
- 첫 번째 줄은 해당 줄에 항목이 없으면
merged.txt.gz
표시하도록 보내고 , 6번 줄은 항목이:2
있는 경우 항목을 제거하도록AB.txt.gz
표시하도록 보내거나 , 마지막 줄은 항목이 있는 경우 동일한 작업을 수행합니다.:1
filtered
CD.txt.gz
- 둘 다 존재하지 않으면
merged
해당AB
행CD
은 영향을 받지 않고 출력됩니다.
이는 주어진 입력에 대한 출력을 생성합니다(입력의 라인 2에 이미 누락된 슬래시가 있는 경우 제외). 원래 입력과 일치하도록 수정할 수 있습니다.
항상 마지막 열은 아니지만 항상 일곱 번째 열인 경우 처음 6개 열과 모든 후행 열을 제거 하지 s/.*
TAB//
마세요 .s/\([^
TAB]
TAB\}\{6\}//;s/
TAB.*//