このコマンドを発行した後、私はこうなります
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.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がない場合はスクリプトの最後にジャンプします。2
b2
!
AB
CD
filtered
b
- 最初の行はその行に項目がない場合
merged.txt.gz
に表示するように送信し、6行目は項目が:2
ある場合は項目を削除するようにマークするようにAB.txt.gz
送信し、最後の行は項目がある場合は同じ操作を行います。:1
filtered
CD.txt.gz
- 両方が存在しない場合、
merged
そのAB
行CD
は影響を受けずに出力されます。
これは、与えられた入力の出力を生成します(入力の2行目にすでに欠落しているスラッシュがある場合を除く)。元の入力と一致するように変更できます。
常に最後の列ではなく、常に7番目の列である場合は、最初の6つの列とすべての末尾の列を削除しないでs/.*
TAB//
ください。s/\([^
TAB]
TAB\}\{6\}//;s/
TAB.*//