2014-02-06 81 views
1

在我的bash腳本中,我試圖用csv文件中的元素創建兩個並行數組。 csv文件可以有5-40行的任何地方。awk輸出無序單元

Array1=($(awk -F, '{a[$1];}END{for (i in a)print i;}' list.csv)) 
Array2=($(awk -F, '{b[$2];}END{for (i in b)print i;}' list.csv)) 

但是,這樣做後,數組中的元素的順序不匹配的文件,他們甚至不匹配對方。這就像awk隨機獲取線。爲什麼會發生這種情況,我該如何解決?謝謝!

回答

1
Array1=($(awk -F, 'BEGIN{i=0;}{a[i++]=$1;}END{for(x=0;x<i;x++) print a[x];}' list.csv)) 
Array2=($(awk -F, 'BEGIN{i=0;}{b[i++]=$2;}END{for(x=0;x<i;x++) print b[x];}' list.csv)) 

在awk中你有關聯數組,所以當你執行的,在它的不知道,你會在你把他們內部的相同順序獲取值。 如果你想讓他們訂購使用一個計數器作爲索引和一個正常的循環,而不是for。

2

關聯數組索引不按順序保存。你正在看到awk內部索引的影響。

相反,你可以在你想要的順序來添加,然後打印出來的順序:

Array1=($(awk -F, '!a[$1]++ { b[n++]=$1; } END{for (i=0; i<n; i++) print b[i];}' list.csv)) 

但是,你甚至不需要將它們全部儲存起來。如果你只是想在第一每個重複的:

Array1=($(awk -F, '!a[$1]++ { print $1; }' list.csv)) 

!a[$1]++是一種常見的伎倆是真正的你第一次看到變量(a[$1]被認爲是0時未設置++增加它的下一次。)。

1

你當然不需要awk這個任務:你不必讀取文件兩次:

array1=() 
array2=() 
while IFS=, read -r a b; do 
    array1+=("$a") 
    array2+=("$b") 
done < list.csv