Shell

提取列名並使用它來輸出文件名

  • December 13, 2019
#chr    fivep   threep  strand  sample1 sample2 sample3 sample4 name1   name2
chrI    9442    9492    +   0   0   0   0   na  na
chrI    12584   12631   +   0   0   0   0   na  na
chrI    12584   12679   +   16  16  15  22  na  na
chrI    12584   12727   +   0   0   0   0   na  na
chrI    12632   12679   +   13  12  16  9   na  na

我有一個上述格式的文件。我想要輸出這樣我得到 4 個單獨的文件作為輸出名稱,它們基本上是列 sample1 , sample2 等。

例如,這就是我想要做的:

awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$5,$4}' > sample1.txt
awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$6,$4}' > sample2.txt
awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$7,$4}' > sample3.txt
awk -v OFS="\t" '{print $1,$2,$3,$9":"$10,$8,$4}' > sample4.txt

我可以為幾列執行此操作,但我有一個包含許多列的大文件。如何以循環方式執行此操作,這樣我就不必單獨鍵入每個 awk 語句

使用 for 循環 ( ksh93, bash, zsh):

for ((i=5;i<=8;i++)); do
 awk -v i="$i" -v OFS="\t" 'NR==1{fname=$i".txt"}{print $1,$2,$3,$9":"$10,$i,$4 > fname}' infile
done

開始和結束欄位在for-loop 中給出。輸出文件名是從帶有附加後綴的標題行中提取的,.txt並且重定向在awk.

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