使用bash连接两个字符串和一个变量

时间:2017-11-23 21:49:14

标签: linux bash

我需要从三个部分,两个字符串和一个变量生成文件名。

for f in `cat files.csv`; do echo fastq/$f\_1.fastq.gze; done

files.csv包含以下行:

Sample_11
Sample_12

我需要生成以下内容:

fastq/Sample_11_1.fastq.gze
fastq/Sample_12_1.fastq.gze

我的问题是我收到了以下文件:

_1.fastq.gze_11
_1.fastq.gze_12

变量后面的字符串删除它之前的字符串。

我感谢任何帮助

此致

3 个答案:

答案 0 :(得分:0)

通常,最好的办法是将变量名称换成大括号。所以,在这种情况下:

  

echo fastq/${f}_1.fastq.gz

有关一般概念的详细信息,请参阅this answer

编辑:另外想一想现在提供的输出让我觉得这根本不是编码问题,而是行结尾和终端/控制台程序之间的冲突

具体来说,如果CSV文件仅以回车符(ASCII / Unicode 13)结束其行,则Sample_11的结尾可能会“回退”该行到开头并覆盖。

在这种情况下,基于this article,我建议更换cat(如果您不想用while之类的东西重新构建实际脚本,用一些会剥去回车的东西,例如:

for f in $(tr -cd '\011\012\040-\176' < temp.csv) do echo fastq/${f}_1.fastq.gze done

正如引用文章所解释的那样,Octal 11是一个标签,12是换行符,40-176是可输入字符(Unicode需要更多思考)。如果文件中没有任何换行符,由于某种原因,您可能希望将其替换为tr '\015' '\012',这会将回车符转换为换行符。

当然,在这一点上,更好的是找到生成文件的任何内容并要求他们将合理的行结尾放入其文件中...

答案 1 :(得分:0)

顺便说一下你的成语:for f in cat files.csv应该避免。请参阅:Dangerous Backticks

while read f
do
    echo "fastq/${f}/_1.fastq.gze" 
done < files.csv

答案 2 :(得分:0)

您可以将其设为xargsprintf

xargs printf 'fastq/%s_1.fastq.gze\n' <files.csv

printf的功能是依次将第一个参数(格式字符串)应用于每个参数。

xargs表示要在尽可能多的文件上运行此命令,因为它可以放在命令行上(如果输入文件太大而无法将所有参数放到单个命令行上,则将其拆分为多个调用,受内核ARG_MAX常量限制。