
このようなファイルがあります
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]\.).*
(肯定的な後読み) は、数字が続き、ドット (.) で終わるすべてのものに一致します。
\K
2 番目の 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/\..*//'