
次のデータがあります。
chr1 134901 139379 - "ENSG00000237683.5";
chr1 860260 879955 + "ENSG00000187634.6";
chr1 861264 866445 - "ENSG00000268179.1";
chr1 879584 894689 - "ENSG00000188976.6";
chr1 895967 901095 + "ENSG00000187961.9";
GTFファイルを解析して作成しました。
可能であれば、awkまたはsedを使用して5列の合計を削除したいと思います"
。;
結果は次のとおりです。
chr1 134901 139379 - ENSG00000237683.5
chr1 860260 879955 + ENSG00000187634.6
chr1 861264 866445 - ENSG00000268179.1
chr1 879584 894689 - ENSG00000188976.6
chr1 895967 901095 + ENSG00000187961.9
答え1
使用gsub
:
awk '{gsub(/\"|\;/,"")}1' file
chr1 134901 139379 - ENSG00000237683.5
chr1 860260 879955 + ENSG00000187634.6
chr1 861264 866445 - ENSG00000268179.1
chr1 879584 894689 - ENSG00000188976.6
chr1 895967 901095 + ENSG00000187961.9
走りたいならただ5番目のフィールドは、他のフィールドに引用符またはセミコロンを保持します。
awk '{gsub(/\"|\;/,"",$5)}1' file
答え2
データが示されているとおりに正しくフォーマットされている場合(つまり、他の項目"
や;
他の列を保存する必要がない場合)、次のようにtr
文字を削除することができます。
tr -d '";' < input.txt > output.txt
答え3
sed を使用して '';'' のすべてのインスタンスを削除します。
sed -i 's/[";]//g' file
5番目の列からsedを削除するだけでは最善の選択肢ではないかもしれません。
答え4
sedソリューション、5番目の列のみを扱うようにします。
sed -E 's/^(([^ ]+ +){4})"([^"]+)";$/\1\3/' infile
chr1 134901 139379 - ENSG00000237683.5
chr1 860260 879955 + ENSG00000187634.6
chr1 861264 866445 - ENSG00000268179.1
chr1 879584 894689 - ENSG00000188976.6
chr1 895967 901095 + ENSG00000187961.9
これはERE(-E
または-r
一部の古いsed)なしで機能しますが、より多くのバックスラッシュが必要です。 POSIX仕様1+
によれば、定量子はERE専用であり、BREで置き換え(または使用)することができます。{1,}
\{1,\}
列がスペースで区切られていない場合は、スペースをPOSIX文字クラスに置き換えて、[:blank:]
タブ文字と一致させることもできます。
正規表現の詳細:
^ # Anchored at start of line
( # Capture group 1 for first 4 columns
( # Capture group 2 for repeat count
[^ ]+ # 1 or more non-spaces
+ # 1 or more spaces
){4} # 4 times "word plus spaces" (columns)
) # End capture group 1
" # Column 5 starts with double quote (not captured)
( # Capture group 3 for column 5
[^"]+ # One or more non-quote characters
) # End capture group 3
"; # Quote and semicolon at end of column 5
$ # Anchored at end of line
1 GNU sed は\+
BRE でも拡張として許可されます。