このようなファイルがあります。
ILMN_1343291 TGTGTTGAGAGCTTCTCAGACTATCCACCTTTGGGTCGCTTTGCTGTTCG NM_001402.5
ILMN_1343295 CTTCAACAGCGACACCCACTCCTCCACCTTTGACGCTGGGGCTGGCATTG NM_002046.3
ILMN_1651209 TCACGGCGTACGCCCTCATGGGGAAAATCTCCCCGGTGACTTTCAGGTCC NM_182838.1
出力ファイルが次のように見えるように、3番目の列の末尾にある数値拡張子を削除したいと思います。
ILMN_1343291 TGTGTTGAGAGCTTCTCAGACTATCCACCTTTGGGTCGCTTTGCTGTTCG NM_001402
ILMN_1343295 CTTCAACAGCGACACCCACTCCTCCACCTTTGACGCTGGGGCTGGCATTG NM_002046
ILMN_1651209 TCACGGCGTACGCCCTCATGGGGAAAATCTCCCCGGTGACTTTCAGGTCC NM_182838
コマンドラインを使用してこれを最適に行うにはどうすればよいですかawk
?私はこれを行うことができますが、perl
コマンドラインでこれを行うことができると確信しています。
答え1
awkを使用してください:
awk -F'.' '{print $1}' file
-F
オプションは、デフォルトのフィールド区切り文字(スペース)をドット(.)に変更します。
$1
フィールド位置のインデックス。(フィールド区切り記号を使用)。
{ILMN_1343291 TGTGTTGAGAGCTTCTCAGACTATCCACCTTTGGGTCGCTTTGCTGTTCG NM_001402}.{5}
^^ field index is $1 ^^$2
revとawkの使用:
rev file | awk -F'.' '{print $2}'|rev # reverse characters of each lines,\
print field number 2 with (.) separator \
and reverse the result again
このrev
ユーティリティは、指定されたファイルを標準出力にコピーし、各行の文字順序を逆に置き換えます。ファイルを指定しない場合は、標準入力を読み込みます。
sedを使用してください:
sed 's/.[0-9]*$//' file
sed 's/.[^.]*$//' file
$
線の終わりを指します。最初の sed コマンドで char(.) の後にゼロ個以上の数字が続くことを検索し、空白に置き換えます。
2番目のsedコマンドは、(.)の後のすべての内容を削除し、ドット(。)自体も削除します。
revとsedを使用してください。
rev file| sed 's/.*[.]//' |rev
ドット(.)の前にあるすべての項目を含めて削除します。
grepを使用してください:
grep -oP '.*(?=\.[0-9])' file
-o、--matchのみ 一致する行の一致する(空でない)部分のみを印刷します。 これらの各セクションは別々の出力ラインにあります。 -P, --perl-正規表現 PATTERNをPerl互換正規表現(PCRE)として解釈する
(?=pattern)
:前方予測:前方予測構造は一対の括弧で構成され、左括弧の後に疑問符と等号が続きます。
.*(?=\.[0-9])
:(順方向予測)は、パターン()を一致するもの.*
ではなく、点(.)と数字が続くすべての項目()と一致します。\.[0-9]
revとgrepを使用してください。
rev file |grep -oP '(?<=[0-9]\.).*' |rev
rev file |grep -oP '[0-9]\.\K.*' |rev
(?<=pattern)
:アクティブリアビュー。一対の括弧。左括弧の後に疑問符、「より小さい」記号、等号が続きます。
(?<=[0-9]\.).*
(前方に戻る)数字の後に来て、ドット(.)で終わるすべての項目と一致します。
\K
2番目のgrepコマンドでは、lookbehindアサーションの代わりにniftyを使用できます。
ストリップ切断:
cut -f1 -d. file
cut -c 1-77 file # Print first 77 characters of each line.
cut - ファイルの各行から部分を削除します。 -d, --delimiter=削除 フィールド区切り文字としてTABの代わりにDELIMを使用してください。 -f, --fields=リスト 次のフィールドのみを選択してください。 -c, --char=リスト この文字だけを選択してください
whileループを使用してください:
while read line; do echo "${line::-2}";done <file
各行の末尾に長さが1の数字だけがあり、長さが固定されている場合に機能します。上記のコマンドは、入力ファイルの各行の末尾にある最後の2文字を削除します。代替コマンドはです${line%??}
。
答え2
拡張子はすべて数値であると仮定します。
perl -pi -e 's/\.\d+$//' /path/to/file
-i
内部編集を実行します(例sed
:)。\d
数値を表し、$
行の終わりを示します。
そしてawk
:
awk 'gsub(/\.[0-9]+$/,"")' /path/to/file
gawk
最新バージョンには内部編集オプションがありますが、どのくらい移植可能かはわかりません。gsub
ターゲット列を指定するオプションのパラメーターをサポートします。
awk 'gsub(/\.[0-9]+$/,"",$3)' /path/to/file
最後の形式には、各列を出力から単一のスペースで区切る望ましくない副作用がありますprint $1,..,$NF
。理由はわかりません。
答え3
使い方awk
は簡単です。フィールド区切り記号を次のように設定します.
。
awk -F. '{print $1}' file
もう1つの方法はシェル(この場合bash)を使用することです。
while IFS=.; read -r lines _; do line+=("$lines"); done <file
printf "%s\n" "${line[@]}"
ILMN_1343291 TGTGTTGAGAGCTTCTCAGACTATCCACCTTTGGGTCGCTTTGCTGTTCG NM_001402
ILMN_1343295 CTTCAACAGCGACACCCACTCCTCCACCTTTGACGCTGGGGCTGGCATTG NM_002046
ILMN_1651209 TCACGGCGTACGCCCTCATGGGGAAAATCTCCCCGGTGACTTTCAGGTCC NM_182838
答え4
これにより、ドットで始まるすべての項目が削除されます。
sed 's/\..*//'