繪製任務。我有數據框中:bash命令用於將單元格內容按分隔符分隔成單元列中的多行
x y1;y2;y3 z1;z2;z3
a b1;b2 c1;c2
我需要:
x y1 z1
x y2 z2
x y3 z3
a b1 c1
a b2 c2
第1列有一個實例始終。單元格中的實例數可以是1到多個,但在2,3列之間總是相等。由於
繪製任務。我有數據框中:bash命令用於將單元格內容按分隔符分隔成單元列中的多行
x y1;y2;y3 z1;z2;z3
a b1;b2 c1;c2
我需要:
x y1 z1
x y2 z2
x y3 z3
a b1 c1
a b2 c2
第1列有一個實例始終。單元格中的實例數可以是1到多個,但在2,3列之間總是相等。由於
像這樣的東西應該讓:
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
出錯了。我爲第1列重複行,但爲2和3重複行數。您能否再次檢查描述,我澄清了它。 –
我不明白,對不起。我只是複製粘貼我的代碼和輸入數據,沒有任何改變,我得到了您的預期輸出:分別以'x'開始,後跟'y1 z1','y2 z2'和'y3 z3'開始的3行。然後2行分別以'a'開頭,後面跟着'b1 c1'和'b2 c2'。你是否100%確定你準確地解釋了你想要的? –
我編輯了我的答案,以顯示我的輸出與您的輸入相似。你能檢查一下自己並解釋你看到的與你所期望的有什麼不同嗎? –
在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
東西壞了。實例變得混合並且連續的單個實例發生在第一列之後(第三列) –
編輯FS作爲問題中更改的樣本數據的結果。它改變了什麼嗎? –
爲了清晰起見,我更改了單元格中的分隔符 –