0

我有制表符分隔的 .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 文件,其中仅包含行名为“Lipid droplet diameter”的所有位置之后的第 2 行和第 3 行。

结果应该是这样的:(我想删除所有其他行而不是那些具有直径信息的行)

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

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

4

3 回答 3

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
于 2013-11-07T12:40:54.767 回答
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
于 2013-11-07T16:03:27.717 回答
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 }'
于 2013-11-07T19:44:04.267 回答