列から拡張子を削除する

列から拡張子を削除する

このようなファイルがあります。

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]\.).*(前方に戻る)数字の後に来て、ドット(.)で終わるすべての項目と一致します。

\K2番目の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/\..*//'

関連情報