你好 GNU/Linux 新手。
我想在一个两列制表符分隔的文件中写入两个变量。在我的代码中,变量是$sample_name
和$file
。
我使用命令:
touch
创建文件和echo -e $sample_name $file | column -t >> $output_file
写每一行。虽然这会产生一个单列文件。
有任何想法吗?
简化脚本:
touch $output_file
for file in $path/*.g.vcf; do
sample_name=`echo $file | grep -P 'HG(\d+)(?=.g)' -o`
echo -e $sample_name $file | column -t >> $output_file
done
预期输出(查看输出文件):
HG00321 ./.../HG00321/HG00321.g.vcf
HG00322 ./.../HG00322/HG00322.g.vcf
# and so on
您不需要使用
column -t
(事实上,这将用空格扩展您的选项卡,以便列正确对齐,无论宽度如何)。只需使用printf
. 并记住双引号你的变量。例如顺便说一句,不需要
touch
文件来创建它。>>
如果文件不存在,重定向将创建一个文件。此外,您可以使用
<<<
而不是echo
与grep
行。例如这会将变量的内容(值)重定向
$file
到 grep 命令中。无论哪种方式,实际上都没有任何显着的好处(除非变量包含改变echo
行为的值,例如-n
,-e
,-E
或一些反斜杠转义字符,例如\n
,\t
,\0nnn
,\xHH
等 - 请参见help echo
bash。顺便说一句,这是为什么printf
在这些天被推荐echo
),但您可能会发现它更容易阅读。看起来你想做的事情就像
这会遍历与您的通配模式匹配的路径名。对于每个路径名,使用提取路径名的文件名部分
basename
(这也可以删除已知文件名后缀.g.vcf
),并与完整路径名一起打印。循环的输出被重定向到输出文件,如果它不存在,shell 将创建它,如果它确实存在,则截断(清空)。
我更改了您使用的变量的名称,因为该名称与外壳
path
中同名的特殊(数组)变量发生冲突。zsh
我还在所有扩展中添加了双引号,以确保我们可以处理所有可能的文件名。如果扩展名不加引号,您会遇到包含空格或通配符的文件名的问题。也可以看看:
在不使用该
basename
实用程序的情况下,使用参数替换来修剪路径名中不需要的位。此代码不使用任何外部实用程序: