2014-11-24 23 views
3

我有一個這樣的文件:如何使用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運行命令後,所需的輸出(某物存在於Linux環境的99%)

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 
+1

分享您的命令吧。 – SMA 2014-11-24 12:09:47

+0

列之間的模式是什麼?標籤?另外,這個算法是什麼?對於第一個,在':'之後打印,最後一列是整個值? – fedorqui 2014-11-24 12:12:28

+0

@soundhax如果您對某個問題有評論,請使用「添加評論」鏈接,請勿破壞性地進行編輯。 – 2015-03-31 12:01:03

回答

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) 
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 
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[\ :]+集S中的字段分隔符爲空或:
+1

它看起來像每個記錄的字段數是不一樣的,這會錯過例如最後一條記錄的「X」。 – 2014-11-24 12:42:13

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

沒有更多的規格上xxxyyy ...

相關問題