2017-08-29 82 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