列の拡張機能を削除する

列の拡張機能を削除する

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

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 つしかないはずです。

答え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(.) の後に 0 回以上の数字が続くものを検索し、それらを空白に置き換えます。

2 番目の sed コマンドでは、(.) に続くすべてのものを削除し、ドット (.) 自体も削除します。

rev と sed を使用する場合:

rev file| sed 's/.*[.]//' |rev

ドット(.)の前のすべてを削除します。また、. 自体も削除します。

grep の場合:

grep -oP '.*(?=\.[0-9])' file
    -o, --一致するもののみ
          一致する行の一致した部分(空でない部分)のみを印刷します。
          各部分は別々の出力行に表示されます。
    -P, --perl-正規表現
          PATTERN を Perl 互換正規表現 (PCRE) として解釈します。

(?=pattern): 肯定先読み: 肯定先読み構造は括弧のペアで構成され、開き括弧の後に疑問符と等号が続きます。

.*(?=\.[0-9]): (肯定的な先読み) は、パターン ( ) を一致の一部.*とせずに、( ) の後に 1 つのドット (.) が続き、数字が出現するすべてのものに一致します。\.[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=DELIM
      フィールド区切り文字としてTABではなくDELIMを使用する

-f, --fields=リスト
      これらのフィールドのみを選択します。

-c, --characters=リスト
      これらの文字のみを選択してください

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

最後の形式には、 を実行したかのように、出力内の各列が 1 つのスペースで区切られるという望ましくない副作用がありますprint $1,..,$NF。理由はわかりません。

答え3

使い方awkは簡単で、フィールド区切り文字を次のように設定するだけです.

awk -F. '{print $1}' file

シェル (この場合は 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/\..*//'

関連情報