Bash

在一個兩列文件中寫入兩個變數(製表符分隔)

  • February 11, 2022

你好 GNU/Linux 新手。

我想在一個兩列製表符分隔的文件中寫入兩個變數。在我的程式碼中,變數是$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

您不需要使用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")

這會將變數的內容(值)重定向$file到 grep 命令中。無論哪種方式,實際上都沒有任何顯著的好處(除非變數包含改變echo行為的值,例如-n, -e,-E或一些反斜杠轉義字元,例如\n, \t, \0nnn,\xHH等 - 請參見help echobash。順便說一句,這是為什麼printf在這些天被推薦echo),但您可能會發現它更容易閱讀。

引用自:https://unix.stackexchange.com/questions/690160