2017-08-29 104 views
0

我有一個名爲list_of_files.txt的文件,它是超過500個其他文件的列表。它看起來像這樣:Bash使循環多次重複代碼

list1.txt 
list2.txt 
list3.txt 
etc 

列出全部看起來像這樣:(所有列由數值) 值1值2值3 VALUE4值5 value6 等

對於每個名單中,我想要剪切某個感興趣的列,對其進行排序,以便數量遞增,並檢查我的原始文件和新文件是否具有相同的順序。

我試圖使一個循環.SH腳本,像這樣:

for i in list_of_files.txt 
do 
cut -f3 -d " " list*.txt > chr*_all_positions.txt 
sort -n chr*_all_positions.txt > chr*_ordered_positions.txt 
diff chr*_all_positions.txt chr*_ordered_positions.txt > result_*.txt 
done  

但是,這是行不通的。任何幫助,將不勝感激。

回答

0

環比數字,而不是文件名:

i=1 
while [[ -f list$i.txt ]] ; do 
    cut -f3 -d " " list$i.txt > chr$i\_all_positions.txt 
    sort -n chr$i\_all_positions.txt > chr$i\_ordered_positions.txt 
    diff chr$i\_all_positions.txt chr$i\_ordered_positions.txt > result_$i.txt 
    ((i++)) 
done 

此外,您還可以使用sort -csort -C檢查輸出是否無需創建_ordered文件排序。

+0

謝謝!這工作。但是,如果我的列表文件是這樣命名的:list1.1.txt,list1.2.txt等 此代碼仍然工作嗎?這似乎並不是我嘗試的時候。 – m93

+0

@ m93:只需根據需要調整代碼。 – choroba

+0

對不起,我對Bash很陌生。我試着通過編寫i = 1.1來進行調整,但我得到了一個錯誤。 – m93

0

使用readarray和陣列

readarray -t arrname < list_of_files.txt 

for filename in "${arrname[@]}"; do 
    ... 
done 

使用閱讀內置

while read filename; do 
    ... 
done < list_of_files.txt