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

Process multiple files and append them in linux/unix

我有超过 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 ,,}' file${j}.txt | awk -v k="$j" 'BEGIN {print [=15=]"\t$k”}' | cat >> combined_file.txt
done

但是脚本给出了以下错误:

awk:未终止的字符串 $k”}... 在源代码行 1 上下文是

<<< awk: giving up source line number 2 awk: non-terminated string $k”}... at source line 1 context is <<< awk: giving up source line number 2

谁能帮我弄明白吗?

您不需要两个不同的 awk 脚本。并且您不使用 $ 来引用 awk 中的变量,它用于引用输入字段(即 $k 表示访问其编号在变量 [=15= 中的字段]).

for i in {1..3}; do
    j=$(printf '%03d' $i)
    awk -v k="$j" -v OFS='\t' '{print , , , k}' file$j.txt
done > combined_file.txt

正如评论中指出的那样,您的问题是您试图将奇数字符用作双引号。不过,一旦你解决了这个问题,你就不需要循环或任何其他复杂性了,你只需要:

$ 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。