我有一份文件如下:
file1.txt
1 10 ABC KK-LK
1 33 23 KK-LK
2 34 32 CK-LK,LK
11 332 2 JK@
21 525 1 JK@
31 902 9 JK@
11 23 2 JK2我试图在第4栏中看到标识符使用的行数:
KK-LK 1-2
CK-LK 3-3
JK@ 4-6
JK2 7-7如果我应用下面的代码,我可以得到number of lines,但是它在一个新行而不是一个range中打印它,这将是一个问题,因为每个identifier至少有一个1 million lines。
grep -n "KK-LK" file1.txt | awk -F ":" '{print $1}'
1
2我怎样才能把这个转换成一个范围?
发布于 2018-03-19 11:31:27
awk解决方案:
awk '{ if ($4 in a) sub(/-[0-9]+/, "-"NR, a[$4]); else a[$4] = NR"-"NR }
END{ for (i in a) print i, a[i] }' file产出:
JK2 7-7
CK-LK,LK 3-3
JK@ 4-6
KK-LK 1-2发布于 2018-03-19 10:49:25
请你试着跟我说一下,如果这对你有帮助的话,请告诉我。
awk '{a[$NF]=a[$NF]?a[$NF] OFS FNR:FNR} END{for(i in a){num=split(a[i],array," ");if(num>1){print i,array[1] "-" array[num]} else {print i,a[i]"-"a[i]}}}' Input_file现在也加入了一种非单一的线性解决方案。
awk '
{
a[$NF]=a[$NF]?a[$NF] OFS FNR:FNR}
END{
for(i in a){
num=split(a[i],array," ");
if(num>1){
print i,array[1] "-" array[num]}
else{
print i,a[i]"-"a[i]}
}}
' Input_file发布于 2018-03-19 14:47:09
另一个awk
$ awk '{if($NF in a) b[$NF]=NR;
else a[$NF]=b[$NF]=NR}
END{for(k in a) print k,a[k]"-"b[k]}' file | sort -k2 | column -t
KK-LK 1-2
CK-LK,LK 3-3
JK@ 4-6
JK2 7-7或者,自从NR>0
$ awk '!a[$NF]{a[$NF]=NR} {b[$NF]=NR} END{for(k in a) print k,a[k]"-"b[k]}'https://stackoverflow.com/questions/49360827
复制相似问题