don*_*sti 10 awk perl text-processing numeric-data
给定一个包含唯一数字的排序输入文件(或命令输出),每行一个,我想将所有连续数字的运行折叠到范围内,这样
n
n+1
...
n+m
Run Code Online (Sandbox Code Playgroud)
变成
n,n+m
Run Code Online (Sandbox Code Playgroud)
输入样本:
2
3
9
10
11
12
24
28
29
33
Run Code Online (Sandbox Code Playgroud)
预期输出:
2,3
9,12
24
28,29
33
Run Code Online (Sandbox Code Playgroud)
cta*_*ac_ 10
随着dc对脑力锻炼:
dc -f "$1" -e '
[ q ]sB
z d 0 =B sc sa z sb
[ Sa lb 1 - d sb 0 <Z ]sZ
lZx
[ 1 sk lf 1 =O lk 1 =M ]sS
[ li p c 0 d sk sf ]sO
[ 2 sf lh d sj li 1 + !=O ]sQ
[ li n [,] n lj p c 0 sf ]sM
[ 0 sk lh sj ]sN
[ 1 sk lj lh 1 - =N lk 1 =M ]sR
[ 1 sf lh si ]sP
[ La sh lc 1 - sc lf 2 =R lf 1 =Q lf 0 =P lc 0 !=A ]sA
lAx
lSx
'
Run Code Online (Sandbox Code Playgroud)
awk '
function output() { print start (prev == start ? "" : ","prev) }
NR == 1 {start = prev = $1; next}
$1 > prev+1 {output(); start = $1}
{prev = $1}
END {output()}
'
Run Code Online (Sandbox Code Playgroud)
小智 5
awk,采用不同的(更像C)方法:
awk '{ do{ for(s=e=$1; (r=getline)>0 && $1<=e+1; e=$1); print s==e ? s : s","e }while(r>0) }' file
Run Code Online (Sandbox Code Playgroud)
同样的事情,甚至更不尴尬:
awk 'BEGIN{
for(r=getline; r>0;){
for(s=e=$1; (r=getline)>0 && $1<=e+1; e=$1);
print s==e ? s : s","e
}
exit -r
}' file
Run Code Online (Sandbox Code Playgroud)
使用 Perl 替代 eval(抱歉混淆...):
perl -0pe 's/(\d+)\n(?=(\d+))/ $1+1==$2 ? "$1," : $& /ge;
s/,.*,/,/g' ex
Run Code Online (Sandbox Code Playgroud)
怎么样
awk '
$0 > LAST+1 {if (NR > 1) print (PR != LAST)?"," LAST:""
printf "%s", $0
PR = $0
}
{LAST = $0
}
END {print (PR != LAST)?"," LAST:""
}
' file
2,3
9,12
24
28,29
33
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2139 次 |
| 最近记录: |