優先順位に基づいて特定の列の値を保持し、行ごとに異なる値を削除します。

優先順位に基づいて特定の列の値を保持し、行ごとに異なる値を削除します。

このコマンドを発行した後、私はこうなります

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.gzCD.txt.gz、[3]で、他の値は削除されます。filtered.txt[2]AB.txt.gz&disc.txt.gz2つの値を保持


出力

/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スクリプトの2行目はandエントリを削除し、4行目はandエントリを削除してからmark()へのジャンプを実行しないため、markがない場合はスクリプトの最後にジャンプします。2b2!ABCDfilteredb
  • 最初の行はその行に項目がない場合merged.txt.gzに表示するように送信し、6行目は項目が:2ある場合は項目を削除するようにマークするようにAB.txt.gz送信し、最後の行は項目がある場合は同じ操作を行います。:1filteredCD.txt.gz
  • 両方が存在しない場合、mergedそのABCDは影響を受けずに出力されます。

これは、与えられた入力の出力を生成します(入力の2行目にすでに欠落しているスラッシュがある場合を除く)。元の入力と一致するように変更できます。

常に最後の列ではなく、常に7番目の列である場合は、最初の6つの列とすべての末尾の列を削除しないでs/.*TAB//ください。s/\([^TAB]TAB\}\{6\}//;s/TAB.*//

おすすめ記事