提取列名并使用它来输出文件名

提取列名并使用它来输出文件名
#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 语句

答案1

使用 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。输出文件名是从带有附加后缀的标题行中提取的.txt,并且重定向是在awk.

相关内容