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

1つのオプションは、目的のファイル名を現在のシェル引数に設定してからペアでprintf印刷するように要求することです。

set -- *
printf '%s %s\n' "$@"  > output

または特定のファイルのみ:

set -- *_R?.fastq

順序は、使用するワイルドカードの拡張によって異なります。ソートをより効果的に制御するには、次のようにグローバルを手動で分割できます。

set -- Paleo*.fastq Vegan*.fastq Omnivore*.fastq FastFood*.fastq

関連情報