如果第二个字段为空,则删除行

如果第二个字段为空,则删除行

这是我的文件,两个字段之间的分隔符 (\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};' 

https://raku.org

相关内容