ファイル名のリストをテキストファイルとして印刷しようとしていますが、特定のファイル名を同じ行に印刷する必要があります。たとえば、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