2017-09-06 73 views

回答

0

像這樣的東西應該讓:

declare -a cols=() # array for individual columns (line fields) 
IFS=' ;'   # fields separators 

while read -a cols; do 
    n=${#cols[@]} # number of fields in current line 
    if ((n < 3 || n % 2 != 1)); then # skip invalid lines 
     printf "skipping invalid line: %s\n" "${cols[*]}" 
     continue 
    fi 
    for ((i = 1; i <= n/2; i += 1)); do # loop over pairs of fields 
     # printf line 
     printf "%s %s %s\n" "${cols[0]}" "${cols[i]}" "${cols[n/2+i]}" 
    done 
done < data.txt 

說明:

  • IFS是使用read將拆分字段行字符的列表。在你的情況下,空間和;似乎是分隔符。
  • read -a cols分配讀取線的字段到cols陣列,起始於細胞運行的0.

實施例:

$ cat data.txt 
x y1;y2;y3 z1;z2;z3 
a b1;b2  c1;c2 
$ ./foo.sh 
x y1 z1 
x y2 z2 
x y3 z3 
a b1 c1 
a b2 c2 
+0

出錯了。我爲第1列重複行,但爲2和3重複行數。您能否再次檢查描述,我澄清了它。 –

+0

我不明白,對不起。我只是複製粘貼我的代碼和輸入數據,沒有任何改變,我得到了您的預期輸出:分別以'x'開始,後跟'y1 z1','y2 z2'和'y3 z3'開始的3行。然後2行分別以'a'開頭,後面跟着'b1 c1'和'b2 c2'。你是否100%確定你準確地解釋了你想要的? –

+0

我編輯了我的答案,以顯示我的輸出與您的輸入相似。你能檢查一下自己並解釋你看到的與你所期望的有什麼不同嗎? –

0

在AWK:

$ awk -F"(\t|;)" '{ 
    for(i=2;i<=4;i++) 
     if($i!="") 
      print $1, $i, $(i+3) 
}' file 
x y1 z1 
x y2 z2 
x y3 z3 
a b1 c1 
a b2 c2 

編輯:另一個版本:

$ awk -F"(\t+|;)" '{    # FS tabs or semicolon  
    for(i=2;i<=int(NF/2)+1;i++) 
     print $1,$i,$(i+int(NF/2)) 
}' file 
x y1 z1 
x y2 z2 
x y3 z3 
a b1 c1 
a b2 c2 
+0

東西壞了。實例變得混合並且連續的單個實例發生在第一列之後(第三列) –

+0

編輯FS作爲問題中更改的樣本數據的結果。它改變了什麼嗎? –

相關問題