#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
.