处理多个文件并将它们附加到linux / unix中

时间:2016-07-08 20:56:26

标签: linux awk cat

我在每个文件中有超过100个文件,其中至少有5-8列(以制表符分隔)。我需要从每个文件中提取前三列,并在第四列添加一些预定义文本并附加它们。

我们说我有3个文件:file001.txtfile002.txtfile003.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

    
  

有人可以帮我解决一下吗?

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。