우선 순위에 따라 특정 열의 값을 유지하고 행당 다른 값을 삭제합니다.

우선 순위에 따라 특정 열의 값을 유지하고 행당 다른 값을 삭제합니다.

이 명령을 내린 후 나는 이렇게 됩니다

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가 없으면 스크립트 끝으로 점프합니다.2b2!ABCDfilteredb
  • 첫 번째 줄은 해당 줄에 항목이 없으면 merged.txt.gz표시하도록 보내고 , 6번 줄은 항목이 :2있는 경우 항목을 제거하도록 AB.txt.gz표시하도록 보내거나 , 마지막 줄은 항목이 있는 경우 동일한 작업을 수행합니다.:1filteredCD.txt.gz
  • 둘 다 존재하지 않으면 merged해당 ABCD은 영향을 받지 않고 출력됩니다.

이는 주어진 입력에 대한 출력을 생성합니다(입력의 라인 2에 이미 누락된 슬래시가 있는 경우 제외). 원래 입력과 일치하도록 수정할 수 있습니다.

항상 마지막 열은 아니지만 항상 일곱 번째 열인 경우 처음 6개 열과 모든 후행 열을 제거 하지 s/.*TAB//마세요 .s/\([^TAB]TAB\}\{6\}//;s/TAB.*//

관련 정보