このファイルをLinuxで変換したいのですが...
1:a:A:G rs123
1:b:C:T rs456
1:c:G:A,C rs174
このファイルの場合...
1:a rs123
1:b rs456
1:c rs174
これを行う方法を知っている人はいますか?よろしくお願いします!
答え1
すべての入力値が一致する場合は、次の2つを除くすべての列を印刷します。
awk -F'[: ]' '{ print $1":"$2" "$5 }' inputFile
答え2
@terdonの解決策には問題はありませんが、楽しみでgawk
解決策を使用してください。
awk -F':[^a-z]+' '{print $1, $2}' file1
連続した文字列の先頭に一致するIFS
コンテキストを形成し、小文字を除くすべての項目の可変長の組み合わせを使用して、目的の2つのブロックのみを残します。regex
:
[^a-z]+
答え3
いくつかのオプション:
$ awk -F'[: ]' '{print $1":"$2,$5}' file
1:a rs123
1:b rs456
1:c rs174
これはawk
、スペースまたはaを:
フィールド区切り文字として使用し、最初のフィールドa :
、2番目、5番目のフィールドを印刷するように指示します。
$ sed -E 's/^([^:]*:[^:]*):.* (.*)$/\1 \2/' file
1:a rs123
1:b rs456
1:c rs174
ここでは、行の先頭( )から最初の( )までのsed
すべての非文字-:
、次の非文字から2番目までキャプチャされます。次に、行の最後のスペースまですべてを一致させ、それ以降のすべての文字をキャプチャします。最後に、ライン全体がキャプチャされた2つのパターン()に置き換えられます。[^:]*
^
:
:
:
\1 \2
$ perl -pe 's/(.+?:.+?):.*\s(\S+)$/$1 $2/' file
1:a rs123
1:b rs456
1:c rs174
これは、上記のsedメソッドと基本的なアイデアが同じですが、貪欲ではない正規表現パターンを使用し、行の最後の空白文字の後に空白以外の文字を検索します。
答え4
すべてのGNU coreutilソリューションに加えて、開いて次のようにvim
入力しても機能します。
:%norm 0f:f:vf hd
Enter
.
できること:
:
コマンドモードに切り替え
%
norm
修飾子はファイルのすべての行で実行されました。
norm
通常モードで次の内容を入力したかのように、複数行で実行できるコマンドです。
0
行の先頭に到達
f:
テキスト内の次のコロン記号(フィールド区切り記号など)項目に移動します。 3番目の列の先頭に達するには、これを2回実行します。
v
ビジュアルモードに入ります。 (削除する項目をより簡単に選択できます :-) )
f˽
(空白に注意してください!
h
)
d
選択したコンテンツを削除