使用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)
我总结这种技术的最好方法是
作为AWK的初学者,此方法有效,但是我发现它有点尴尬,并且担心在6个月后重新使用代码,我将不再理解它。这是在AWK中合并这3个文件的最佳方法吗? JOIN是否可以实际处理这种格式的最终输出格式?
答案 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