我的文件为:
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
如何将此转换为范围?
答案 0 :(得分:2)
请您试着跟随并告诉我这是否对您有帮助。
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
答案 1 :(得分:2)
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
答案 2 :(得分:2)
另一个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]}'
答案 3 :(得分:1)
你可以像这样一次通过:
parse.awk
# Initialize start-line and id variables
NR == 1 { s=1; id = $4 }
# When the id no longer matches print the range
$4 != id {
print id ": " s "-" NR-1
# Reset variables for the next id
s=NR; id=$4
}
# Print the last range when EOF occurs
END {
print id ": " s "-" NR
}
像这样运行:
awk -f parse.awk infile.txt
输出:
KK-LK: 1-2
CK-LK,LK: 3-3
JK@: 4-6
JK2: 7-7