2つの列ファイルに2つの変数(タブ区切り)を書き込む

2つの列ファイルに2つの変数(タブ区切り)を書き込む

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それを作成するためにファイルは必要ありません。 >>ファイルが存在しない場合、リダイレクトによってファイルが生成されます。

代わりに線を使用することもできます<<<。例えばechogrep

  sample_name=$(grep -oP 'HG(\d+)(?=.g)' <<< "$file")

これにより、変数の内容(値)が$filegrepコマンドにリダイレクトされます。どちらにしても、実際には大きな利点はありません(変数にecho動作変更値(例えば、、、またはいくつかのバックスラッシュエスケープ文字(たとえば、、、、など))が含まれていない限り、bashを参照してください。理由です)、しかし、読みやすくなります。-n-e-E\n\t\0nnn\xHHhelp echoprintfecho

おすすめ記事