私のファイルは、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
代替の改行文字の前にはバックスラッシュが必要です。
p
ubstitute コマンドの 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};'