2017-04-07 71 views
1

我有一個數據需要將記錄分成兩個新記錄。我的樣本數據是這樣的:如何在Unix中將數據分成兩個新記錄?

id country place 
1 A  mall park 
2 B  beach 
3 C  hotel resort 
4 D  museum 
5 E  garden 

我希望將數據變成了這個樣子:

id country place 
1 A  mall 
1 A  park 
2 B  beach 
3 C  hotel 
3 C  resort 
4 D  museum 
5 E  garden 

的數據是製表符分隔。我嘗試使用sedawk,但我無法獲得正確的語法。有其他的命令我可以使用,以便我可以得到我想要的輸出嗎?

+0

可能的重複[創建P在UNIX中的ivot表](http://stackoverflow.com/questions/39747893/creating-pivot-table-in-unix) – philshem

回答

1
awk -v OFS="\t" ' 
     FNR==1{         # Read first line 
       max=NF       # save no of fields 
       print       # print header 
       next       # go to next line 
     } 
    NF>max{          # if no of fields are greater than max fields 
       split($0,fd)     # split record by fields sep, and store in array fd 
       NF=max-1      # set NF to max-1 
       for(i=max; i in fd; i++)  # loop through fd from max 
         print $0,fd[i];   # print modified record, and field 
       next       # stop processing go to next 
     }$1=$1         # $1=$1 is for making tab as o/p field separator for unmodified record 
    ' file 

輸入

$ cat f 
id country place 
1 A  mall park 
2 B  beach 
3 C  hotel resort 
4 D  museum 
5 E  garden 

輸出

$ awk -v OFS="\t" 'FNR==1{max=NF; print; next}NF>max{split($0,fd); NF=max-1; for(i=max; i in fd; i++)print $0,fd[i]; next}$1=$1' f 
id country place 
1 A mall 
1 A park 
2 B beach 
3 C hotel 
3 C resort 
4 D museum 
5 E garden 
2

這是很容易與awk做到:

awk -v OFS="\t" 'NF == 3 { print } NF == 4 { print $1, $2, $3; print $1, $2, $4 }' some_file 

並沒有太多更難以sed

sed '/ /{h;s/ .*//p;x;s/[^\t]\+ //}' some_file 
0

方法1:

此處設置的OFS。輸出字段分隔符作爲選項卡。

echo "$line" | 
awk -v var="$mycol_new" -F $'\t' 'BEGIN {OFS = FS} {$3 = var; print}' 

Metho2:

或只設置字段分隔符的\ t。

... | awk 'BEGIN {FS="\t"}; {print $1}' 

方法3:

如果你想用awk,供應分隔符的方式是既可以通過-f參數或作爲FS =後綴:

awk -F '\t' '{ print $2 }' yourfile 

或:

awk '{ print $2 }' FS='\t' yourfile 
0

試試這個 -

$ cat f 
id |country| place 
1 | A | mall park 
2 | B | beach 
3 | C | hotel resort 
4 | D | museum 
5 | E | garden 
$ awk -F'|' '{n=split($3,a," "); for (i=1;i<=n;i++) {$3=a[i];print}}' f 
id country place 
1 A mall 
1 A park 
2 B beach 
3 C hotel 
3 C resort 
4 D museum 
5 E garden 

注意:您需要更改從管道到標籤的分隔符。

0

AWK溶液(擴頻place列值到單獨的行):

awk -v OFS='\t' 'NF>3 {for(i=3;i<=NF;i++) print $1,$2,$i;next;}; {$1=$1; print}' file 

輸出:

id country place 
1 A mall 
1 A park 
2 B beach 
3 C hotel 
3 C resort 
4 D museum 
5 E garden 

OFS='\t' - 輸出字段分隔符,設定爲\t

NF>3 - 檢查是否有3名以上的字段(在情況下,如果place列包含多比一個字)

相關問題