使用AWK或JOIN合并> 2个文件?

时间:2019-01-20 03:48:30

标签: join awk

使用AWK合并2个文件是StackOverflow上的一个很好介绍的主题。但是,将3个文件读入数组的技术变得更加复杂。当我将输出格式化为R脚本时,我将需要添加很多语法,因此我不认为可以使用JOIN。这是到目前为止我正在使用的简单版本:

awk 'FNR==1{f++}
     f==1{a[FNR]=$1;next}
     f==2{b[FNR]=$1;next}
     {print a[FNR], "<- c(", b[FNR], ",", $1, ")"}' words.txt x.txt y.txt 

位置:

$ cat words.txt
word1
word2
word3

$ cat x.txt
1
2
3

$ cat y.txt
11
22
33

然后输出

word1 <- c(1, 11)
word2 <- c(2, 22)
word3 <- c(3, 22)

我总结这种技术的最好方法是

  1. 创建变量f来跟踪您正在处理的文件
  2. 对于文件1,将值读入数组a
  3. 对于文件2,将值读入数组b
  4. 进入文件3,在此处连接最终输出

作为AWK的初学者,此方法有效,但是我发现它有点尴尬,并且担心在6个月后重新使用代码,我将不再理解它。这是在AWK中合并这3个文件的最佳方法吗? JOIN是否可以实际处理这种格式的最终​​输出格式?

3 个答案:

答案 0 :(得分:2)

@ RavinderSingh13解决方案的变体

$ paste {words,x,y}.txt | awk '{print $1, "<- c(" $2 ", " $3 ")"}'

答案 1 :(得分:1)

编辑: 。能否请您尝试以下操作。

paste words.txt x.txt y.txt | awk '{$2="<- c("$2", "$3")";$3="";sub(/ +$/,"")} 1'

输出如下。

word1 <- c(1, 11)
word2 <- c(2, 22)
word3 <- c(3, 33)


如果您只想在Vice栏中添加3个文件的内容,然后尝试执行以下操作。

paste words.txt x.txt y.txt 
word1   1   11
word2   2   22
word3   3   33

答案 2 :(得分:1)

如果出于可读性考虑,则可以更改文件检查方法以及变量名。
请尝试以下方法:

awk 'ARGIND==1{words[FNR]=$1;}
     ARGIND==2{xcol[FNR]=$1;}
     ARGIND==3{print words[FNR], "<- c(", xcol[FNR], ",", $1, ")"}' words.txt x.txt y.txt

以上文件检查方法适用于GNU awk。

更改为另一个,以及更改文件读取顺序为:

awk 'FILENAME=="words.txt"{print $1, "<- c(", xcol[FNR], ",", ycol[FNR], ")";}
     FILENAME=="x.txt"{xcol[FNR]=$1;}
     FILENAME=="y.txt"{ycol[FNR]=$1;}' x.txt y.txt words.txt 

您也可以在这里看到,文件读取顺序和块顺序可以不同。
由于words.txt的第一列或main column可以这么说,因此最后阅读是明智的。

您还可以使用FILENAME==ARGV[1] FILENAME==ARGV[2]等检查文件,并在其中放置注释(使用awk脚本文件并使用awk -f scriptfile加载注释更好):< / p>

awk 'FILENAME==ARGV[1]{xcol[FNR]=$1;} #Read column B, x column
     FILENAME==ARGV[2]{ycol[FNR]=$1;} # Read column C, y cloumn
     FILENAME==ARGV[3]{print $1, "<- c(", xcol[FNR], ",", ycol[FNR], ")";}' x.txt y.txt words.txt