AWK基于行名并导出以下3行和4行

时间:2013-11-07 12:29:53

标签: awk grep

我有制表符分隔的.txt文件,如下所示:

""
"5 um"
"Lipid droplet number"
"Lipid droplet diameter"
"Mito"
22
0
5 um
64 255 0 0
2
1615 2022
2037 2021
1
Lipid droplet number
64 255 0 0
1
583 1945
0
Lipid droplet diameter
64 255 0 0
2
1406 849
1364 882
0
Lipid droplet diameter
64 255 0 0
2
1105 1333
1082 1369
0
Lipid droplet diameter
64 255 0 0
2
619 1932
580 1953
0

我想创建一个新的.txt文件,包括所有地方的第2和第3行,其中rowname为“Lipid droplet diameter”。

结果应该是这样的:(我想删除除直径信息之外的所有其他行)

1406 849
1364 882
1105 1333
1082 1369
619 1932
580 1953  

2列和2行是可以的。 4列和1行也可以。我认为这个最适合Excel。

3 个答案:

答案 0 :(得分:1)

丑陋的getline awk

awk '/diameter/ {getline;getline;getline;a=a?a" "$0:$0;getline;b=b?b" "$0:$0} END {print a"\n"b}' file
1406 849 1105 1333 619 1932
1364 882 1082 1369 580 1953

更好的版本

awk '/diameter/ {f=NR} f && f+3==NR {a=a?a" "$0:$0} f && f+4==NR {b=b?b" "$0:$0} END {print a"\n"b}' file
1406 849 1105 1333 619 1932
1364 882 1082 1369 580 1953

更好的表格视图:

awk '/diameter/ {f=NR} f && f+3==NR {a=a?a"\t"$0:$0} f && f+4==NR {b=b?b"\t"$0:$0} END {print "Column1\t\tColumn2\t\tColumn3\n" a"\n"b}' file
Column1         Column2         Column3
1406 849        1105 1333       619 1932
1364 882        1082 1369       580 1953

答案 1 :(得分:1)

对于变量行和列,您可以尝试:

BEGIN {
    OFS="\t"; SUBSEP="@"; MAXROWS=1000
}

/^Lipid droplet diameter$/ {
    cols++; rows=0
    while (NF != 2) getline
    while (NF == 2 && rows < MAXROWS) {
        vectors[cols, ++rows] = $0
        getline
    }
}

END {
    for (c = 1; c <= cols; c++) printf("Column%i%c", c, c<cols ? OFS : "\n")
    for (r = 1; r <= rows; r++) {
        for (c = 1; c <= cols; c++) printf("%s%c", vectors[c, r], c<cols ? OFS : "\n")
    }
}

示例假设上述内容保存为lipid.awk

awk -f lipid.awk input

答案 2 :(得分:1)

使用sed:

sed -n '/Lipid droplet diameter/{n;n;n;N;p}' input

给出:

1406 849
1364 882
1105 1333
1082 1369
619 1932
580 1953

另一种方法:

grep -A 4 'Lipid droplet diameter' input | sed -n '/--/!p' | \ 
    awk ' (NR-1)%5>2 { print }'