我在每个文件中有超过100个文件,其中至少有5-8列(以制表符分隔)。我需要从每个文件中提取前三列,并在第四列添加一些预定义文本并附加它们。
我们说我有3个文件:file001.txt
,file002.txt
,file003.txt
。
file001.txt
:
chr1 1 2 15
chr2 3 4 17
file002.txt
:
chr1 1 2 15
chr2 3 4 17
file003.txt
:
chr1 1 2 15
chr2 3 4 17
combined_file.txt
:
chr1 1 2 f1
chr2 3 4 f1
chr1 1 2 f2
chr2 3 4 f2
chr1 1 2 f3
chr2 3 4 f3
为简单起见,我保持文件内容相同。 我的脚本如下:
#!/bin/bash
for i in {1..3}; do
j=$(printf '%03d' $i)
awk 'BEGIN { OFS="\t"}; {print $1,$2,$3}' file${j}.txt | awk -v k="$j" 'BEGIN {print $0"\t$k”}' | cat >> combined_file.txt
done
但脚本出现以下错误:
awk:非终止字符串$ k“} ...在源代码行1 上下文是
<<< awk:放弃 源行号2 awk:非终止字符串$ k“} ...在源代码行1 背景是 <<< awk:放弃 源行号2
有人可以帮我解决一下吗?
答案 0 :(得分:3)
您不需要两个不同的awk
脚本。并且您不能使用$
来引用awk
中的变量,这些变量用于引用输入字段(即$k
表示访问其编号为的字段变量k
)。
for i in {1..3}; do
j=$(printf '%03d' $i)
awk -v k="$j" -v OFS='\t' '{print $1, $2, $3, k}' file$j.txt
done > combined_file.txt
答案 1 :(得分:1)
正如评论中指出的,你的问题是你试图使用奇数字符,好像它们是双引号。一旦你解决了这个问题,你就不需要循环或任何其他复杂性,你需要的是:
$ awk 'BEGIN{FS=OFS="\t"} {$NF="f"ARGIND} 1' file*
chr1 1 2 f1
chr2 3 4 f1
chr1 1 2 f2
chr2 3 4 f2
chr1 1 2 f3
chr2 3 4 f3
上面使用的GNU awk用于ARGIND。