2013-04-12 56 views
0

所以我想根據第8列將一個相當大的文件拆分成幾個小文件。所以我寫這個劇本:Bash將大文件拆分成更小的文件

#!/bin/bash 
run_command(){ 
eval ${1} 
wait 
} 
chInput=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" "A" "D" "P") 
sampInput=("heyA") 

for ((x=0;x<${#chInput[@]};x++));do 
com="awk -F'\t' '$8=="${chInput[x]}"' /home/location/"$sampInput"_This_P.txt > "$sampInput"Ch"${chInput[x]}".txt" 
run_command "${com}" 
done 

但它不是因爲

「$ 8 ==」

awk: ==1 
awk:^syntax error 
awk: ==2 
awk:^syntax error 
awk: ==3 
awk:^syntax error 
awk: ==4 
awk:^syntax error 

但只是在做工作

awk -F'\t' '$8==1' /home/location/heyA_This_P.txt > Ch1.txt 
來自命令行的

沒有工作

我能做些什麼來解決這個問題?

回答

2

嚴重的問題是雙引號; $8將在您分配變量時被某些東西(可能完全沒有)替代。您可以嘗試使用單引號進行正確的轉義,但真正的解決方案可能需要深呼吸,然後從eval或Awk腳本變量中重新開始。

無論如何,這個椒鹽脆餅邏輯的目的是什麼?你或許應該閱讀,並採取心臟,在http://mywiki.wooledge.org/BashFAQ/050

這裏的建議是在解決您的問題,快速嘗試:特別

#!/bin/bash 

chInput=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" "A" "D" "P") 
sampInput=("heyA") 

for ((x=0;x<${#chInput[@]};x++));do 
    awk -F'\t' '$8=="'"${chInput[x]}"'"' /home/location/"$sampInput"_This_P.txt > "$sampInput"Ch"${chInput[x]}".txt 
done 

通知的構建插值"${chInput[X]}"到腳本(這是真的只有我改變了,實際上,除了刪除變量和eval東西)。這是一個單引號中的字符串,與雙引號中的字符串相鄰,與單引號中的字符串相鄰,這些字符串在Bash中計算爲單個字符串。因此'foo'"bar"'baz'評估爲foobarbaz並且類似地'"foo"'"'bar'"相鄰評估爲"foo"'bar'。這裏,與"${chInput[x]}"相鄰的'$8=="''"'相鄰評估爲$8=="...",其中雙引號中的內容在分配時被替換。

(你並不真正需要的陣列,或者,你可以只是做

for c in "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" "11" "12" \ 
     "13" "14" "15" "16" "17" "18" "19" "Z" "T" "G" "F" \ 
     "A" "D" "P" 
do 
    awk -F'\t' '$8=="'"$c"'"' /home/location/"$sampInput"_This_P.txt > "${sampInput}Ch$c.txt" 
done 

,並與經典的Bourne shell兼容)

+0

我試圖這樣做的原因是因爲我運行這個文件和另一個文件的比較,因爲它的大小,程序掛在這個文件上。我想玩,看看我是否可以採取懶惰的方式,分割文件,而不是重寫一些代碼。我讀了一些文章說它會起作用,有些人說它不會,我想親自看看 – Stephopolis

相關問題