bash脚本:行尾字符问题:excel文件

在Linux下ubuntu 10在bash下工作

我有Bash脚本,从gedit创build的.txt文件读取行,然后推入到一个数组。 按预期工作。

但是,当我的input是从Excel生成的.txt它会引发错误

")syntax error: invalid arithmetic operator (error token is " echo -n $elem | od -x yields 0000000 3533 0d32 0000004 

我不禁感觉到我几乎在解决问题,但这让我感到沮丧。 我会感谢一些帮助

谢谢

excel中的@MarcB文件:(从gedit中分割出来的;与外观相反的是,在这个文件中没有空行,而是行交替int,str,int,str …)0

A→GATCGGAAGAGCGTCGTGTAGGGAAAGAGTGTAGATC 1

甲?GATCGGAAGAGCACACGTCTGAACTCCAGTCACATCACGAT [AC] T …

2

甲?GATCGGAAGAGCACACGTCTGAACTCCAGTCACCGATGTAT [AC] T …

3

甲?GATCGGAAGAGCACACGTCTGAACTCCAGTCACTTAGGCAT [AC] T …

4

甲?GATCGGAAGAGCACACGTCTGAACTCCAGTCACTGACCAAT [AC] T …

甲?GATCGGAAGAGCACACGTCTGAACTCCAGTCACACAGTGAT [AC] T …

6

甲?GATCGGAAGAGCACACGTCTGAACTCCAGTCACGCCAATAT [AC] T …

7

甲?GATCGGAAGAGCACACGTCTGAACTCCAGTCACCAGATCAT [AC] T …

8

甲?GATCGGAAGAGCACACGTCTGAACTCCAGTCACACTTGAAT [AC] T …

9

甲?GATCGGAAGAGCACACGTCTGAACTCCAGTCACGATCAGAT [AC] T …

10

甲?GATCGGAAGAGCACACGTCTGAACTCCAGTCACTAGCTTAT [AC] T …

 rtstxt='readthrusequences.txt' # establish readthrusequence array --------------------------------------------- # push into sparse array the readthru adapter sequence for each TruSeq index # use the TruSeq Index number as key to the sequence forts=${pathsir}${rtstxt} # FileOf ReadThruSequences rts=( $(cat ${forts}) ) idx="" elem="" isIdx=1 for elem in ${rts[@]}; do echo '$elem:'${elem} # echo 'elem:' ${elem} 'before IF - isIdx:' $isIdx '- idx:' $idx if [[ $isIdx = 1 ]]; then echo ' 1_block - $isIdx:'$isIdx' - elem:'$elem' - idx:'$idx; indexseq[$elem]=0; #echo " indexseq[elem] set to ${indexseq[$elem]}"; idx=$elem; #echo " idx set to elem (ie $idx)"; isIdx=0; #echo " isIdx reset to $isIdx"; #echo " " ; else #echo " 2_block - isIdx:$isIdx - elem:$elem - idx:$idx"; indexseq[$idx]=$elem; #echo " indexseq[idx] set to ${indexseq[$idx]}"; isIdx="1"; idx="0"; #echo " isIdx reset to $isIdx - idx reset to $idx"; #echo ""; fi # echo "keys (TruSeq index): ${!indexseq[*]}" # echo "vals (indexed adapter seq): ${indexseq[*]}" done 

此代码将文件内容推入数组,使用int作为索引以及str和值。

注释行是debugging。 如果第一个是未评论的控制台产量

 before IF - isIdx: 1 - idx: - idx:k - $isIdx:1 - elem:0 ")syntax error: invalid arithmetic operator (error token is " 

明确指出一个行结束问题; 但是我在这堵墙上撞了太久,还没有find解决办法。 我知道有一个简单的…

excel生成的文件几乎可以肯定使用\ r \ n字符对来终止每一行。 (在文件末尾可能有一个Ctrl-Z字符)。 基于Unix的系统只希望\ n字符终止一行input(和Ctrl-D(通常不是)作为文件结束标记)。

解决方法是,编辑文件以删除每行末尾的^ M个字符(\ r)(也检查文件末尾的^ Z并将其删除),或者标准为

  dos2unix file file2 .... filen 

我希望这有帮助。