Bash - 如何打印列中的值出现在行尾的次数
Bash - how to print the number of times a value in a column occurs at the end of the row
我有一个制表符分隔的文件...
123 1:2334523 yes
127 1:332443 yes
113 1:332443 no
115 1:55434 no
115 1:55434 no
115 1:55434 yes
我想计算第 2 列中的值出现在第 2 列中的次数,然后将其打印到行尾,例如...
123 1:2334523 yes 1
127 1:332443 yes 2
113 1:332443 no 2
115 1:55434 no 3
115 1:55434 no 3
115 1:55434 yes 3
因此在第 2 列中 1:332443 出现了两次,1:55434 出现了 3 次。
我认为这在 Awk 或 sed 中应该相对容易,但还没弄清楚。
你可以这样做:
awk 'NR == FNR { ++ctr[]; next } { print [=10=] "\t" ctr[]; }' filename filename
因为我们需要在打印前知道计数器,所以我们需要遍历文件两次,这就是 filename
被提到两次的原因。那么 awk 代码是:
NR == FNR { # if the record number is the same as the record number in the
# current file (that is: in the first pass)
++ctr[] # count how often field 2 showed up
next # don't do anything else for the first pass
}
{ # then in the second pass:
print [=11=] "\t" ctr[]; # print the line, a tab, and the counter.
}
这是只读取文件一次的awk
:
awk '{a[NR]=[=10=];b[]++;c[NR]=} END {for (i=1;i<=NR;i++) print a[i]"\t"b[c[i]]}' file
123 1:2334523 yes 1
127 1:332443 yes 2
113 1:332443 no 2
115 1:55434 no 3
115 1:55434 no 3
115 1:55434 yes 3
这会将所有数据栈存储到一个数组a
。统计数组b
中的字段数2
,然后存储索引栈数组c
.
最后,打印出数组。
我有一个制表符分隔的文件...
123 1:2334523 yes
127 1:332443 yes
113 1:332443 no
115 1:55434 no
115 1:55434 no
115 1:55434 yes
我想计算第 2 列中的值出现在第 2 列中的次数,然后将其打印到行尾,例如...
123 1:2334523 yes 1
127 1:332443 yes 2
113 1:332443 no 2
115 1:55434 no 3
115 1:55434 no 3
115 1:55434 yes 3
因此在第 2 列中 1:332443 出现了两次,1:55434 出现了 3 次。
我认为这在 Awk 或 sed 中应该相对容易,但还没弄清楚。
你可以这样做:
awk 'NR == FNR { ++ctr[]; next } { print [=10=] "\t" ctr[]; }' filename filename
因为我们需要在打印前知道计数器,所以我们需要遍历文件两次,这就是 filename
被提到两次的原因。那么 awk 代码是:
NR == FNR { # if the record number is the same as the record number in the
# current file (that is: in the first pass)
++ctr[] # count how often field 2 showed up
next # don't do anything else for the first pass
}
{ # then in the second pass:
print [=11=] "\t" ctr[]; # print the line, a tab, and the counter.
}
这是只读取文件一次的awk
:
awk '{a[NR]=[=10=];b[]++;c[NR]=} END {for (i=1;i<=NR;i++) print a[i]"\t"b[c[i]]}' file
123 1:2334523 yes 1
127 1:332443 yes 2
113 1:332443 no 2
115 1:55434 no 3
115 1:55434 no 3
115 1:55434 yes 3
这会将所有数据栈存储到一个数组a
。统计数组b
中的字段数2
,然后存储索引栈数组c
.
最后,打印出数组。