GNU/Linux を初めてご利用いただきありがとうございます。
タブ区切りの2列ファイルに2つの変数を作成したいと思います。私のコードでは、変数$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
ベストアンサー1
使用する必要はありませんcolumn -t
。実際には、タブが空白に拡張され、幅に関係なく列が正しく並べ替えられます。 。を使用しprintf
て変数を二重引用符で囲むことを忘れないでください。例えば
for file in "$path/"*.g.vcf; do
sample_name=$(echo "$file" | grep -P 'HG(\d+)(?=.g)' -o)
printf "%s\t%s\n" "$sample_name" "$file" >> "$output_file"
done
ちなみに、touch
それを作成するためにファイルは必要ありません。 >>
ファイルが存在しない場合、リダイレクトによってファイルが生成されます。
代わりに線を使用することもできます<<<
。例えばecho
grep
sample_name=$(grep -oP 'HG(\d+)(?=.g)' <<< "$file")
これにより、変数の内容(値)が$file
grepコマンドにリダイレクトされます。どちらにしても、実際には大きな利点はありません(変数にecho
動作変更値(例えば、、、またはいくつかのバックスラッシュエスケープ文字(たとえば、、、、など))が含まれていない限り、bashを参照してください。理由です)、しかし、読みやすくなります。-n
-e
-E
\n
\t
\0nnn
\xHH
help echo
printf
echo