如何使用cut以不同格式输出初始行?

时间:2014-11-24 12:07:22

标签: linux bash awk sed cut

我有一个这样的文件:

A: 1.2.3.4       Z: xxx             R: a              Q W
A: 5.6.7.8       Z: yyy             R: b              X Y
A: 9.10.11.12    Z: zzz             R: c              L N X

运行cutsed 之后的所需输出(99%的Linux环境中存在的内容)

1.2.3.4:xxx:a:Q-W
5.6.7.8:yyy:b:X-Y
9.10.11.12:zzz:c:L-N-X

4 个答案:

答案 0 :(得分:3)

awk的一种方式:

$ awk '{printf "%s:%s:%s:",$2,$4,$6;for(i=7;i<NF;i++)printf "%s-",$i;print $NF}' file 
1.2.3.4:xxx:a:Q-W
5.6.7.8:yyy:b:X-Y
9.10.11.12:zzz:c:L-N-X

<强>解释

脚本将针对文件中的每一行运行:

printf "%s:%s:%s:",$2,$4,$6;    # print the 2nd, 4th, 6th field separated by a :
for(i=7;i<NF;i++)               # from the 7th field to the penultimate field
printf "%s-",$i;                # print the field value followed by a -
print $NF                       # print the last field (followed by a newline)

答案 1 :(得分:0)

通过sed,

$ sed 's/^[^[:space:]]\+[[:space:]]\+\([^[:space:]]\+\)[[:space:]]\+[^:]*:[[:space:]]\+\([^[:space:]]\+\)[[:space:]]\+[^:]*:[[:space:]]\+\([^[:space:]]\+\)[[:space:]]\+/\1:\2:\3:/;s/[[:space:]]\+/-/g' file
1.2.3.4:xxx:a:Q-W
5.6.7.8:yyy:b:X-Y
9.10.11.12:zzz:c:L-N-X

答案 2 :(得分:0)

较短版本的awk就像

$ awk -F[\ :]+ '{print $2":"$4":"$6":"$7"-"$8}' input
1.2.3.4:xxx:a:Q-W
5.6.7.8:yyy:b:X-Y
9.10.11.12:zzz:c:L-N
  • -F[\ :]+将字段分隔符设置为空格或:

答案 3 :(得分:0)

sed 's/  *[A-Z]: */:/g;s/...//;s/\(:[a-z]\)  */\1:/;s/  */-/g' YourFile

没有关于xxxyyy,...

的更多规范