有如下文本,其中前5行内容为

1111111:13443253456
2222222:13211222122
1111111:13643543544
3333333:12341243123
2222222:12123123123

用shell脚本处理后,按下面格式输出:

[1111111]
13443253456
13643543544
[2222222]
13211222122
12123123123
[3333333]
12341243123

#!/bin/bash
sort -n 1.txt |awk -F ':' '{print $1}'|uniq >id.txt
for id in `cat id.txt`
do
  echo "[$id]"
  awk -F ':' '$1=="'$id'" { print $2}' 1.txt
done

解析:

sort -n 使用纯数字排序

awk -F ':' '{print $1}' 以“:”冒号为分隔符,打印第一字域(第一部分)

uniq 去重复的行

>id.txt 输出重定向到id.txt文本中

awk -F ':' '$1=="'$id'" { print $2}' 1.txt :以“:”冒号分隔,如果第一域的值等于$id的值,打印第二域。


扩展:

文件内容如下:

2016-12-08       00:09        血战钢锯岭

2016-12-08       03:01        你的名字

2016-12-08       04:00        长城

2016-12-08       04:01        萨利机长

2016-12-09       07:35        神奇动物在    

2016-12-09       09:24        湄公河行动    

2016-12-09       10:59        我不是潘金莲        

2016-12-09       12:43        海洋奇缘

2016-12-09       14:29        神奇四侠2015

2016-12-10       16:30        死侍

2016-12-10       16:31        加勒比海盗5:

2016-12-10       16:36        三体

2016-12-10       18:04        阿凡达2

2016-12-10       19:40        日落七次

要求输出结果为:

[2016-12-08]

00:09        血战钢锯岭

03:01        你的名字

04:00        长城

04:01        萨利机长

[2016-12-09]

07:35        神奇动物在    

09:24        湄公河行动    

10:59        我不是潘金莲        

12:43        海洋奇缘

14:29        神奇四侠2015

[2016-12-10]

16:30        死侍

16:31        加勒比海盗5:

16:36        三体

18:04        阿凡达2

19:40        日落七次


答案:

#!/bin/bash
awk -F ' '  '{print $1}' 2.txt|uniq >21.txt
for id in `cat 21.txt`
do
  echo "[$id]"
  awk  '$1=="'$id'" {print $2"      "$3"\n"}' 2.txt
 echo
done


纯属个人见解,不正之处请指出