对发生模式不匹配的文件进行行编号

时间:2018-05-03 22:11:02

标签: linux bash csv awk sed

我想对1D数组的行进行编号,使其包含两个字段,即数字" \ t" DATA;但是,我想跳过编号并为包含已定义字符的行输入空白条目(在我的情况下' - ')。我理解这可能与 awk 有关,但我不确定如何实现它。

示例输入:

A
G
T
C
-
A
G
-
T
C

示例输出:

1 \t A
2 \t G
3 \t T
4 \t C
  \t -
5 \t A
6 \t G
  \t -
7 \t T 
8 \t C

(为了清晰起见,添加了空格)

2 个答案:

答案 0 :(得分:1)

awk中的另一个人。它使用awk内部变量NR并从中减去不匹配的数量(在变量c中):

$ awk 'BEGIN{OFS="\t"}{print (/-/ && ++c?"":NR-c) OFS $0}' file
1       A
2       G
3       T
4       C
        -
5       A
6       G
        -
7       T
8       C

答案 1 :(得分:0)

您可以使用awk:

$ echo "$txt" | awk '/A|G|T|C/{printf "%s\t%s\n", ++i, $1; next} {print "\t" $1}'
1   A
2   G
3   T
4   C
    -
5   A
6   G
    -
7   T
8   C

这与示例很好地配合。如果你有更复杂的输入,你的正则表达式或正则表达式和逻辑的组合可能需要加强。你明白了......

如果您希望awk仅增加计数器并打印,如果这四个字母之一存在完全匹配,请使用关联数组:

$ echo "$txt" | awk 'BEGIN { split("AGTC",x,""); for (e in x) a[x[e]] }
                     $1 in a {print ++i "\t" $1; next}
                             {print "\t" $1}'