这是我的文件,两个字段之间的分隔符 (\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
这将“填充”线分为三个部分:
- 开头的数字
^[0-9]+
- 空格或制表符
[[:space:]]+
- 第二列字母数字
[[:alnum:]]+
第一部分和第三部分被 包围()
,因此它们可以在替换中\1
重复使用。\2
替换中的换行符前面需要有一个反斜杠。
仅当可以进行替换时, ubstitute 命令p
的 rint 标志才会输出缓冲区,而其他输出则由该选项抑制。这样,仅处理具有第二个条目的行。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};'