最初の列で最初の2つのフィールドを検索します。

最初の列で最初の2つのフィールドを検索します。

このファイルを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ビジュアルモードに入ります。 (削除する項目をより簡単に選択できます :-) )

(空白に注意してください! h

d選択したコンテンツを削除

関連情報