处理多个文件并将它们附加到 linux/unix
Process multiple files and append them in linux/unix
我有超过 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 ,,}' 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。
我有超过 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 ,,}' 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。