将多个文件名打印到txt文件中的特定行

将多个文件名打印到txt文件中的特定行

我正在尝试将文件名列表打印到文本文件,并要求在同一行上打印某些文件名。例如,我有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

相关内容