我有bash和awk腳本,用於從文本文件中提取數據。
但是,對於大型數據集來說太慢了,並且不能很好地工作。我相信有可能在一個awk命令中寫下我所有的bash循環,並且請求有人幫助我解決這個問題。awk腳本循環和執行數學運算
cat dummy_list
AAA
AAAA
AAAAA
cat dummy_table
13 19 AAA 69 96 "ID-999" 34
23 42 AAA 12 19 "ID-999" 64
53 79 AAA 43 58 "ID-482" 36
13 43 AAA 12 15 "ID-492" 75
23 90 AAA 45 87 "ID-492" 34
12 41 AAAA 76 79 "ID-923" 23
19 58 AAAA 15 87 "ID-923" 75
10 40 AAAA 18 82 "ID-482" 23
11 18 AAAA 18 82 "ID-482" 52
15 19 AAAA 18 82 "ID-482" 62
59 69 AAAA 10 18 "ID-482" 83
78 89 AAAA 32 41 "ID-983" 24
23 53 AAAAA 78 99 "ID-916" 82
我從這個表想什麼:
每dummy_list項目(
AAA
或AAAA
或AAAAA
)提取不同時期的ID範圍是多少提到(我的意思是唯一列4+ 5 + 6(如69 96 "ID-999"
))。有重複的ID(如18 82 "ID-482"
),我必須丟棄它們。
我的腳本是這樣的:while read a; do awk -v VAR="$a" '($3==VAR) {print $4"\t"$5"\t"$6}' dummy_table | sort -u | cut -f 3 | sort | uniq -c | awk '{print $1}' | tr '\n' ' ' | awk -v VAR="$a" '{print VAR"\t"$0}' done < dummy_list AAA 1 2 2 AAAA 2 2 1 AAAAA 1
這是一樣
AAA "ID-482" mentioned once; "ID-492" mentioned twice; "ID-999" mentioned twice
。這是我想要的輸出。
對於每個dummy_list項目,獲取使用相同ID提及的次數的平均數。例如
AAA
與"ID-999"
發生兩次,一次與"ID-482"
與"ID-492"
兩次 - 所以它的(2 + 1 + 2)/3=1.66我的劇本是這樣的:
while read a ; do ID_TIMES=$(awk -v VAR="$a" '($3==VAR) {print $6}' dummy_table | sort -u | wc -l) && awk -v VAR="$a" '($3==VAR) {print $6}' dummy_table | sort | uniq -c | awk -v VAR="$ID_TIMES" '{sum+=$1} END {print sum/VAR}' done < dummy_list AAA 1.666 AAAA 2.333 AAAAA 1
對於每個dummy_list項目提取ID範圍並計算列之間的比例。 例如:
for AAA's ID-999:
RANGE1=sum $5-$4(96-69) + $5-$4(19-12)
RANGE2=sum $7(34+64)
then RANGE2*100/RANGE1=288
對於這樣的輸出:AAA 288 240 242 .... AAAAA 390
我不能由我自己來寫這樣的劇本,因爲我卡住了兩個變量$ RANGE1和$ RANGE2。
如果可能的話,在這一步中丟棄像18 82 "ID-482"
這樣的重複範圍會很好。
我認爲,所有這些有操作只能與一個awk
命令來計算,我感到絕望關於我的腳本。我真的希望有人能幫助我做這個手術。
您是否考慮過使用關係數據庫? – 2013-06-12 18:55:35
這就是爲什麼我需要所有這些數據提取。 – PoGibas