2016-03-02 61 views
2

我有88個文件夾,每個文件夾都包含文件「pair.'numbers'」。 (對3472,對7829等)。我需要用awk處理文件以提取第二列,但我需要保存這些數字。如果我嘗試:如何在腳本中處理文件的名稱

#!/bin/bash 
for i in {1..88}; do 
    awk '{print $2}' ~/Documents/attempt.$i/pair* > ~/Results/pred.pair* 
done 

它不保存的數字,但只給出了一個文件:pred.pair*

感謝您的任何提示。

回答

2

有幾種方法可以做到這一點:awkFILENAME變量,您可以將輸出從awk腳本中重定向到其基於FILENAME操縱的字符串。

或者你可以用bash

for i in {1..88}; do 
    to_be_processed_fname=$(ls ~/Documents/attempt.$i/pair*) 
    extension="${to_be_processed_fname/*./}" 
    awk '{print $2}' "${to_be_processed_fname}" > "$HOME/Results/pred.${extension}" 
done 

現在上面當然做到這一點,如果你有相同的目錄內的多個pair*文件失敗。但我要把它留給你。

+0

總是給你的shell變量,除非你不心裏有一個特定的目的引用它們並完全理解所有含義(http://unix.stackexchange.com/q/171346/133219)。使用'$(...)'代替棄用的反引號(http://unix.stackexchange.com/q/126927/133219)。避免在shell中編寫循環(http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice)。 –

2
#!/bin/bash 
for i in {1..88}; do 
    awk '{fname=FILENAME;sub(".*/", "", fname);print $2 > ("~/Results/pred."fname)}' ~/Documents/attempt.$i/pair* 
done 

使用AWK構建變量FILENAME。我們需要從FILENAME得到基地名稱fname。然後$2值重定向到"~/Results/pred."fname

+1

感謝您指出問題。更正了腳本。 – 7171u

相關問題