Linux脚本排序和没有分隔符的组

时间:2015-07-08 03:58:05

标签: shell sorting sum

输入为:

10001123
20001234
30002111
40003111
50004000

要求:
从2到5的字符排序 按字符分组从2到5
总和字符6到8
仅显示具有字符6至8的行。 0

预期输出为:

10001357
30002111
40003111

2 个答案:

答案 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'
相关问题