输入为:
10001123
20001234
30002111
40003111
50004000
要求:
从2到5的字符排序
按字符分组从2到5
总和字符6到8
仅显示具有字符6至8的行。 0
预期输出为:
10001357
30002111
40003111
答案 0 :(得分:1)
$ sed -r 's/(.)(....)(...)/\1 \2 \3/' file | awk '{if (!($2 in a))a[$2]=$1; b[$2]+=$3;} END{for (i in b) if (b[i]>0)print a[i],i,b[i];}' | sort -nk2 | sed 's/ //g'
10001357
30002111
40003111
让我们把命令分成几部分。
首先是sed命令,它用空格分隔我们的组:
$ sed -r 's/(.)(....)(...)/\1 \2 \3/' file
1 0001 123
2 0001 234
3 0002 111
4 0003 111
5 0004 000
第二部分是awk进行求和:
awk '{if (!($2 in a))a[$2]=$1; b[$2]+=$3;} END{for (i in b) if (b[i]>0)print a[i],i,b[i];}'
awk的输出如下:
1 0001 357
3 0002 111
4 0003 111
接下来是排序,确保我们的输出符合所需的顺序:
sort -nk2
最后,我们使用sed删除我们添加的空格:
sed 's/ //g'
请注意,这一切都可以用awk完成。我们可以将输入行分解为substr
的部分。使用普通的awk,我们需要编写自己的排序例程,或者如果GNU awk可用,我们可以使用它的内置排序例程asort
。
答案 1 :(得分:0)
这很简洁:
sort -k 1.2,1.5 file | awk '{split($1, a, ""); sum=a[6]+a[7]+a[8]} sum > 0'