我正在尝试将文件名列表打印到文本文件,并要求在同一行上打印某些文件名。例如,我有4个文件。
Paleo_R1.fastq
Paleo_R2.fastq
Vegan_R1.fastq
Vegan_R2.fastq
我想要的输出是
Paleo_R1.fastq Paleo_R2.fastq
Vegan_R1.fastq Vegan_R2.fastq
我知道我可以使用 ls 函数并直接输出到文本文件,ls >> file.txt
但没有选项可以将特定输入行项目打印到特定输出行。
此外,我知道我可以使用这样的 for 循环 >
for file in Vegan*R1*.fastq;
do echo $file ${file%_R1.fastq}_R2.fastq >> file.txt;
done
但我不想为每个文件名使用单独的命令,即。适合素食主义者和原始人饮食。
有没有办法将某些行打印到特定的输出行(将输入行 1 和 2 打印到输出行 1,将输入行 3 和 4 打印到输出行 2,依此类推...)
编辑:该规则基于每 N=2 个文件,而不是文件名。
答案1
或许
$ ls *.fastq | xargs -n2
Bar_R1.fastq Bar_R2.fastq
Bar_R3.fastq Foo_R1.fastq
Foo_R2.fastq Foo_R3.fastq
Paleo_R1.fastq Paleo_R2.fastq
Vegan_R1.fastq Vegan_R2.fastq
或用于列输出
$ ls *.fastq | xargs -n2 | column -t
Bar_R1.fastq Bar_R2.fastq
Bar_R3.fastq Foo_R1.fastq
Foo_R2.fastq Foo_R3.fastq
Paleo_R1.fastq Paleo_R2.fastq
Vegan_R1.fastq Vegan_R2.fastq
(添加>> file.txt
到命令中以将输出附加到文件中)
请注意,这两个示例仅适用于不带空格的文件名。
对于带有空格的文件:
$ for i in *.fastq; do echo -ne "$i\0"; done | xargs -0 -n2
答案2
使用您已有的解决方案,只需执行以下操作即可不是指定文件名前缀Vegan
:
for file in *_R1.fastq; do
printf '%s %s\n' "$file" "${file%_R1.fastq}_R2.fastq"
done >file.txt
在循环之后而不是每个输出命令使用printf
和重定向只是我个人的偏好。
对于给定的文件名,这会file.txt
生成
Paleo_R1.fastq Paleo_R2.fastq
Vegan_R1.fastq Vegan_R2.fastq
答案3
一种选择是将所需的文件名设置为当前 shell 参数,然后要求printf
成对打印它们:
set -- *
printf '%s %s\n' "$@" > output
或仅某些文件:
set -- *_R?.fastq
该顺序取决于您使用的通配符的扩展。如果您想更好地控制排序,那么您可以以某种方式手动拆分全局,例如:
set -- Paleo*.fastq Vegan*.fastq Omnivore*.fastq FastFood*.fastq