2番目のフィールドが空の場合は行を削除します。

2番目のフィールドが空の場合は行を削除します。

私のファイルは、2つのフィールド間の区切り文字(\ t)です。

1   a
2   b
3   
4   d
5
6   e

中間ファイルを受け取りたいです。

1  a
2  b
4  d
6  e

そして最終文書

>1
a
>2
b
>4
d
>6
e

答え1

以下が含まれている場合file

$ cat file
1   a
2   b
3   
4   d
5
6   e

複数のスペースやタブを区切り文字とし、以下を試してください。

$ awk '$2!=""' file
1   a
2   b
4   d
6   e

中間ファイルの場合は、次のようになります。

$ awk '$2!=""{printf ">%s\n%s%s",$1,$2,ORS}' file
>1
a
>2
b
>4
d
>6
e

最終文書を入手するには。

答え2

質問にタグを付けましたawkが、いくつかの孤独なsed -iいたずらをしているので、あえてsed解決策を提示します。

sed -En 's/^([0-9]+)[[:space:]]+([[:alnum:]]+)$/>\1\
\2/p' yourfile

これは「塗りつぶし」行を3つの部分に分けます。

  • 最初に数字^[0-9]+
  • スペースまたはタブ[[:space:]]+
  • 文字と数字の2番目の列[[:alnum:]]+

最初と3番目の部品は、()交換時に\1再使用可能に囲まれています。\2

代替の改行文字の前にはバックスラッシュが必要です。

pubstitute コマンドの rint フラグは置換が可能な場合にのみバッファを出力しますが、このオプションは他の出力を抑制します。これにより、2番目の項目がある行のみが処理されます。s-n

答え3

使用幸せ(以前のPerl_6)

raku -ne '.put if .words[1];'  

入力例:

1   a
2   b
3   
4   d
5
6   e

出力例(1):

1   a
2   b
4   d
6   e

サンプル出力(1)をサンプル出力(2)に変換するには:

raku -ne '.map(">" ~ *).words.join("\n").put;' 

#OR

raku -ne '.put for .map(">" ~ *).words;'  

出力例(2):

>1
a
>2
b
>4
d
>6
e

要約すると、[サンプル入力(2)からサンプル出力を生成する]:

raku -ne '.map(">" ~ *).words.join("\n").put if .words[1] ;' 

#OR

raku -ne 'if .words[1] {.put for .map(">" ~ *).words};' 

https://raku.org

関連情報