我有一个这样的文本文件:
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"
- 但这不是问题。
答案 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的下一个迭代/记录/行才被使用,有效地跳过了最后一行。