AWK集团经过n行数

时间:2017-09-05 16:49:10

标签: unix awk sh

我有一个这样的文本文件:

lqqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqqqqqwqqqqqqqqqqqqqk
xtable_name        xcolumn_name      xother_info   x
tqqqqqqqqqqqqqqqqqqnqqqqqqqqqqqqqqqqqnqqqqqqqqqqqqqu
xqs_tab1           xcol01            xblahblah01   x
xqs_tab1           xcol02            xblahblah02   x
xqs_tab1           xcol03            xblahblah03   x
xqs_tab2           xcol09            xblahblah04   x
xqs_tab2           xcol01            xblahblah05   x
xqs_tab2           xcol02            xblahblah06   x
xqs_tab2           xcol03            xblahblah07   x
xqs_tab2           xcol04            xblahblah08   x
xqs_tab2           xcol05            xblahblah09   x
xqs_tab2           xcol06            xblahblah10   x
xqs_tab3           xcol01            xblahblah11   x
xqs_tab3           xcol02            xblahblah12   x
mqqqqqqqqqqqqqqqqqqvqqqqqqqqqqqqqqqqqvqqqqqqqqqqqqqj

我想在每个表中得到这样的列数:

qs_tab1, 3
qs_tab2, 7
qs_tab3, 2

在这个论坛上阅读了类似的问题后,我创建了以下脚本:

#!/bin/sh
awk '
BEGIN   { FS=" x";}
{
    tablename[$1]++;
}
END { for (i in tablename) {
        print tablename[i], i;
        }
}
'

这让我大部分都在那里,但是我想错过前3行和最后一行。

我尝试将if (NR > 3)类型语句放在不同的地方,但我总是遇到错误。

我还想避免每行中的第一个"x" - 但这不是问题。

1 个答案:

答案 0 :(得分:2)

您希望将条件放在添加到数组tablename[]的代码块之前:

#!/bin/sh
awk '
BEGIN   { FS=" x"; }
NR > 3 { tablename[$1]++; }
END { for (i in tablename) {
        print tablename[i], i;
        }
}
'

那将跳过前3行。跳过最后一个并不是那么简单。为此,我们创建一个新变量来保存我们添加到数组的值,直到下一条记录。然后当我们到达最后一行时,脚本结束,最后一行不会到达数组。你可以把它想象成一个缓冲区,这通常是我给这个变量命名的,这里虽然我将它命名为“firstfield”,因为它似乎是合适的:

#!/bin/sh
awk '
BEGIN   { FS=" x" }
NR > 4 { tablename[firstfield]++ }
NR > 3 { firstfield=$1 }
END { for (i in tablename) {
        print tablename[i], i;
        }
}
'

现在我们设置了firstfield变量,但是直到awk的下一个迭代/记录/行才被使用,有效地跳过了最后一行。

相关问题