2016-01-15 30 views
4

我有一個看起來像這樣(列由製表符分隔)的文件來創建新線:根據外列

Owner Phone Car 
Dan 111-111-1111 Avalon Camry 
Stacy 222-222-2222 Corolla Yaris Camry 
Henry 333-333-3333 Prius 

我希望所有的額外輛自己的行低於原(與複製每增加汽車車主和電話信息),所以它看起來就像這樣:

Owner Phone Car 
Dan 111-111-1111 Avalon 
Dan 111-111-1111 Camry 
Stacy 222-222-2222 Corolla   
Stacy 222-222-2222 Yaris 
Stacy 222-222-2222 Camry 
Henry 333-333-3333 Prius 

我想知道如果有一種方法來實現這個用awk或sed的(一個襯墊最好)。

+0

裏克,是所有的領域和所有的汽車分開標籤? – entpnerd

+0

@JonathanThomas是 – Rick

回答

8

隨着awk你可以可以遍歷從3領域的結束,並與現場12打印他們一起:

awk '{for(i=3;i<=NF;i++){print $1,$2,$i}}' file 

順便說一句,如果你想輸出面色很好地對準你可以管到column命令:

awk '{for(i=3;i<=NF;i++){print $1,$2,$i}}' file | column -t 
+0

這個答案也適用於製表符,而不僅僅是空格。 – entpnerd

+0

是的,因爲選項卡屬於awk默認字段分隔符的集合。 – hek2mgl

+0

@ hek2mgl工作完美,謝謝 – Rick

1

隨着SED:與換行符替換反覆和多部未華回去取了分隔的多個字,而之前printi其後每場追加將模式空間添加到第一個嵌入換行符。

sed -n -e 's/\t/\n/g' -e 's/\n/\t/' -e 's/\n/\t/' -eP -e:l -e 's/\n/\t/' -eta -eb -e:a -e 's/\([^\t]*\t[^\t]*\)\t[^\t]*\(\t[^\t]*\)$/\1\2/' -etb -eb -e:b -eP -ebl < file 

awk的方式是很容易:)

1

這可能會爲你工作(GNU SED):

sed -r 's/\S+/\\S+/g;s/\s+/\\s+/g;s|^(.*)\\S\+|s/(\1)\\S+/\&\\n\\1/;\\//P;D|;q' file | 
sed -rf - file 

這從的第一行(標題)建立了一個sed腳本文件,然後對該文件運行腳本,即如果標題由三個字段組成,則會生成以下腳本:

sed -r 's/^(\S+\s+\S+\s+)\S+/&\n\1/;//P;D' file 

此腳本將前兩個字段分組並將它們追加(以換行符爲前綴)爲原始行。然後如果圖案匹配,則打印第一行然後刪除,重複該過程直到不再發生匹配。