Join 如何从两个文件中交错列?

Join 如何从两个文件中交错列?,join,text,awk,merge,Join,Text,Awk,Merge,假设我们有两个文件(大小相同的m*n矩阵),其中包含列: A1, A2, A3, A4, ..., An 及 预期产出将是: A1, B1, A2, B2, A3, B3, A4, B4, ..., An, Bn 如何做到这一点?我想有一些awk一行程序,但我还没有建立正确的一个 考虑到两个文件具有相同的行数和字段数=相同的数组维度,在我的测试中类似的内容似乎还可以: $ cat file1 a1,a2,a3 a4,a5,a6 $ cat file2 b1,b2,b3 b4,b5,b6

假设我们有两个文件(大小相同的m*n矩阵),其中包含列:

A1, A2, A3, A4, ..., An 

预期产出将是:

A1, B1, A2, B2, A3, B3, A4, B4, ..., An, Bn 

如何做到这一点?我想有一些awk一行程序,但我还没有建立正确的一个

考虑到两个文件具有相同的行数和字段数=相同的数组维度,在我的测试中类似的内容似乎还可以:

$ cat file1
a1,a2,a3
a4,a5,a6

$ cat file2
b1,b2,b3
b4,b5,b6

$ awk 'NR==FNR{f1[FNR]=$0;next};{split(f1[FNR],ff1,",");split($0,ff2,","); \
for (f=1;f<=length(ff1);f++) printf ff1[f]","ff2[f](f!=length(ff1)?",":"\n")}' file1 file2
a1,b1,a2,b2,a3,b3
a4,b4,a5,b5,a6,b6
$cat文件1
a1、a2、a3
a4、a5、a6
$cat文件2
b1、b2、b3
b4,b5,b6
$awk'NR==FNR{f1[FNR]=$0;next};{拆分(f1[FNR],ff1,“,”);拆分($0,ff2,“,”)\

对于(f=1;f在我的测试中类似的内容似乎是可以的,考虑到两个文件具有相同的行数和字段=相同的数组维度:

$ cat file1
a1,a2,a3
a4,a5,a6

$ cat file2
b1,b2,b3
b4,b5,b6

$ awk 'NR==FNR{f1[FNR]=$0;next};{split(f1[FNR],ff1,",");split($0,ff2,","); \
for (f=1;f<=length(ff1);f++) printf ff1[f]","ff2[f](f!=length(ff1)?",":"\n")}' file1 file2
a1,b1,a2,b2,a3,b3
a4,b4,a5,b5,a6,b6
$cat文件1
a1、a2、a3
a4、a5、a6
$cat文件2
b1、b2、b3
b4,b5,b6
$awk'NR==FNR{f1[FNR]=0;next};{split(f1[FNR],ff1,“,”);split($0,ff2,“,”)\
对于(f=1;f
awk'
开始{FS=OFS=“,”}
NR==FNR{a[NR]=$0;next}
{
拆分(a[FNR],f)
对于(i=1;i
awk'
开始{FS=OFS=“,”}
NR==FNR{a[NR]=$0;next}
{
拆分(a[FNR],f)

对于(i=1;i如果,如您的输入所示,您只使用每个输入的一行,则按记录处理可能比按字段处理更容易。您可以通过stdin读取一个文件,并显式读取另一个文件

作为单行程序,这可能如下所示:

awk 'BEGIN {ORS=RS=","} {print $1; getline < "f2"; print $1}' f1; echo

如您的输入所示,如果您只使用每一个输入的一行,则按记录处理可能比按字段处理更容易。您可以通过stdin读取一个文件,并显式读取另一个文件

作为单行程序,这可能如下所示:

awk 'BEGIN {ORS=RS=","} {print $1; getline < "f2"; print $1}' f1; echo

使用
tr
rs
(),如果可用。如果没有,请与当地管理员联系或入侵地球。首先,测试数据:

$ cat foo bar
a1,a2,a3
b1,b2,b3
将其发送到
tr
用空格替换

$ cat foo bar | tr , ' '
a1 a2 a3
b1 b2 b3
然后转到
rs
进行转置:

$ cat foo bar | tr , ' ' | rs -T
a1  b1
a2  b2
a3  b3
最后转到另一个
rs
压缩一行上的上一行:

$ cat foo bar | tr , ' ' | rs -T | rs 1
a1  b1  a2  b2  a3  b3

最后一个
rs
可以替换为
tr\n'
rs
用于输入和输出的荣誉分隔符,请参见手册页。我故意省略了逗号。

使用
tr
rs
(),如果可用。如果没有,请与您当地的管理员联系或入侵地球。首先,测试数据:

$ cat foo bar
a1,a2,a3
b1,b2,b3
将其发送到
tr
用空格替换

$ cat foo bar | tr , ' '
a1 a2 a3
b1 b2 b3
然后转到
rs
进行转置:

$ cat foo bar | tr , ' ' | rs -T
a1  b1
a2  b2
a3  b3
最后转到另一个
rs
压缩一行上的上一行:

$ cat foo bar | tr , ' ' | rs -T | rs 1
a1  b1  a2  b2  a3  b3
最后一个
rs
可以替换为
tr\n'
rs
尊重用于输入和输出的分隔符,请参见手册页。我故意省略了逗号。

粘贴+tr+sedUnix shell技巧:

file1
内容:

A1, A2, A3, A4, A5, A6, A7
B1, B2, B3, B4, B5, B6, B7

file2
内容:

A1, A2, A3, A4, A5, A6, A7
B1, B2, B3, B4, B5, B6, B7

粘贴+tr+sedUnix shell技巧:

file1
内容:

A1, A2, A3, A4, A5, A6, A7
B1, B2, B3, B4, B5, B6, B7

file2
内容:

A1, A2, A3, A4, A5, A6, A7
B1, B2, B3, B4, B5, B6, B7


再使用
awk
paste
一次解决方案也不会有什么坏处

paste -d',' file1 file2 | awk -F ',' '{ 
    z = ""
    for (i=1; i <= NF/2; ++i){ 
        x = i+(NF/2)
        y = $i","$x
        z = z","y
    }
    print substr(z,2,length(z))
}' 
paste-d','file1 file2 | awk-F','
z=“”

对于(i=1;i再使用
awk
paste
一次解决方案不会有任何影响

paste -d',' file1 file2 | awk -F ',' '{ 
    z = ""
    for (i=1; i <= NF/2; ++i){ 
        x = i+(NF/2)
        y = $i","$x
        z = z","y
    }
    print substr(z,2,length(z))
}' 
paste-d','file1 file2 | awk-F','
z=“”

对于(i=1;i您尝试过什么?我们这里的大多数人都很乐意帮助您改进您的手艺,但不太乐意担任短期无薪编程人员。请在一份报告中向我们展示您迄今为止的工作、您期望的结果和您得到的结果,我们将帮助您解决问题。您尝试过什么?我们这里的大多数人都很乐意帮助您提高您的craft,但不太乐意担任短期无薪编程人员。向我们展示您到目前为止的工作,您期望的结果和您得到的结果,我们将帮助您解决。需要指出的是,此解决方案依赖于
bash
进行进程替换。OP没有指出他们使用的是什么shell或操作系统。@ghoti是为Unix shellProcess替换而添加的,它不是ash、dash、csh、tcsh的一部分。我相信AT&T ksh(但我认为不是pdksh)也使用bash的表示法,但这种非POSIX特性在zsh中的工作方式不同,我不知道fish是否支持它。那么“用于Unix shell”有什么用呢意思?需要指出的是,此解决方案依赖于
bash
进行进程替换。OP没有指出他们使用的是什么shell或操作系统。@ghoti,为Unix shell添加的进程替换不是ash、dash、csh、tcsh的一部分。我相信bash的表示法是由AT&t ksh共享的(但我认为不是pdksh),但这个非POSIX特性在zsh中的工作方式不同,我不知道fish是否支持它。那么“for Unix shell”是什么意思呢?这和Ed Morton的答案都能正常工作(如问题所示,文件是m*n矩阵,而不仅仅是一行)。由于详细的解释,将此答案标记为正确。此答案和Ed Morton的答案都能正常工作(如问题所示,文件是m*n矩阵,而不仅仅是一行)。由于详细的解释,将此答案标记为正确。