【问题标题】:File names stacking during for loopfor循环期间文件名堆叠
【发布时间】:2011-06-08 16:49:39
【问题描述】:

我是 shell 脚本的新手,所以这可能是一个愚蠢的问题。虽然我还没有在网上找到答案。我正在使用一个同事脚本并对其进行更改,以便它适用于我的数据。现在我正在运行一个只使用我的三个数据文件的测试。代码在脚本中的某个位置执行 for 循环,并且应该为每个不同的文件执行一次循环(3 次)。

listtumor=`cat /Users/TReiersen/Work-Folder/OV/DataProcessing/TestRun/MatchedTumorTest.txt`
for i in $listtumor
do
lst=`ls /Users/TReiersen/Work-Folder/OV/DataProcessing/TestRun/freshstart/${i}*.txt | awk -F'/' '{print $9}'`

MatchedTumorTest.txt 仅包含我用于测试的三个不同文件名,没有 '.txt' 据我所知,这段代码应该只运行脚本三次,每个文件一次。相反,我收到了这个错误:

ls: /Users/TReiersen/Work-Folder/OV/DataProcessing/TestRun/freshstart/TCGA-04-1514-01A-01D-0500-02_S01_CGH_105_Dec08\rTCGA-04-1530-01A-02D-0500-02_S01_CGH_105_Dec08\rTCGA-04-1542-01A-01D-0500-02_S01_CGH_105_Dec08*.txt: No such file or directory

由于某种原因,所有文件名都堆叠在一起,而不是循环单独访问每个文件名。任何想法为什么会发生这种情况?

谢谢, T.J.

【问题讨论】:

    标签: macos shell unix


    【解决方案1】:

    看起来您的文本文件中的行可能由回车符而不是换行符分隔。由于您的示例中的所有文件名都没有空格,因此如果您像这样初始化 listtumorfor 循环应该可以正常工作:

    listtumor=`tr '\r' '\n' < /Users/TReiersen/Work-Folder/OV/DataProcessing/TestRun/MatchedTumorTest.txt`
    

    tr 命令会将回车转换为换行符,这是大多数文本处理器(如 shell 自己的 for 命令)所期望的),并将结果写入标准输出。

    【讨论】:

    • 这也很有效!我被要求不要使用 while 循环,所以我使用了这个。谢谢!
    【解决方案2】:

    for 循环不能很好地处理某些类型的分隔符。试试这个:

    while read line; do
        lst=`ls /Users/TReiersen/Work-Folder/OV/DataProcessing/TestRun/freshstart/${line}*.txt | awk -F'/' '{print $9}'`
        ...
    done < /Users/TReiersen/Work-Folder/OV/DataProcessing/TestRun/MatchedTumorTest.txt
    

    我在这里假设您使用换行符分隔 MatchedTumorTest.txt。

    【讨论】:

    • @Chris 它似乎已经摆脱了原来的错误,但现在我得到了不同的错误。
    • qc-column-level-tumorTEST.sh:第 104 行:语法错误:文件意外结束
    • 我不知道这是否与所做的更改有关;我会玩一会儿。
    • @T.J.,在done 行上使用&lt; 而不是&lt;&lt; 进行文件重定向
    【解决方案3】:

    所以结合在一起:

    dir="/Users/TReiersen/Work-Folder/OV/DataProcessing/TestRun"
    file="$dir/MatchedTumorTest.txt"
    
    < "$file" tr '\r' '\n' | while read tumor
    do
       ls "$dir/freshstart" | grep "$tumor.*\.txt$" 
    done
    

    将打印目录 $dir/freshstart 中的所有 .txt 文件名,其中包含文件 MatchedTumorTest.txt 的名称

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-23
      • 2023-01-14
      • 1970-01-01
      相关资源
      最近更新 更多