如何提高AWK的特定列数

如何提高AWK的特定列数

我有一个很大的文本文件,总共有 46 列:

输入

Column1 Column2 ... Column46

我需要枚举并计算从第 17 列到第 46 列本身重复的次数。例如:

我的文件是这样的:

Column17 Column18 Column19 Column20 Column21 Column22 Column23 ... Column46

Column17 Column18 Column19 Column20 Column21 Column22 Column23 ... Column46
Column17 Column18          Column20          Column22
         Column18          Column20
                           Column20

期望的输出:

1 Column17 - 2 times
2 Column18 - 3 times
3 Column19 - 1 time
4 Column20 - 4 times
5 Column21 - 0 times
6 Column22 - 2 times
7 Column23 - 1 time
    " "    - N times
29 Column46 - 1 times

我的 awk 命令:

awk '{n=1;if(NR==1)n=25;for(i=n;i<=NF;i++) a[$i]++} END{for(val in a) print val,a[val]}' filelog.txt

实际输出:

Column1 ... Column46
bla 1 blaN...3 bla 3 
bla 3 blaN...2 bla 5
bla 7 blaN...4 bla 7

获取整个文件的所有字符串并计算它们重复的次数。 例如:

Column1 //There are 54 lines, takes all words/strings of that column
bla 3 //The 3 and 4, is the number of repetitions.
bla 4

但我的命令很重要全部列(来自1, 直到46)以及每个短语本身,我想要的是从 17 到 46 的数,就像所需输出有什么办法可以用我的相同命令来制作吗?还是一定要由其他人来制作?

答案1

使用命令与-n枚举选项。

并指定n=17因为你想从那里开始。

使用以下命令:

cat -n <(awk '{n=17;if(NR==1)n=25;for(i=n;i<=NF;i++) a[$i]++} END{for(val in a) print val,a[val]}' filelog.txt)

答案2

如果我正确理解你的要求,那么这就是问题所在:

{n=1;if(NR==1)n=25;for(i=n;i<=NF;i++) ...

对于除第一个记录之外的每条记录,您都设置n=1.然后处理从 开始的所有列n。但你实际上想要设置n=17.

相关内容