Bash Unix:将第二列的每个元素附加到第一列的每个元素

Bash Unix:将第二列的每个元素附加到第一列的每个元素,bash,unix,cartesian-product,Bash,Unix,Cartesian Product,我不是一个经验丰富的程序员,我还没有找到解决以下问题的方法。请原谅,如果我的措辞不正确,这可能是我的搜索问题 我有两个单列文件 A B C 及 我想创建一个文件,将第二列的每个元素附加到第一列的每个元素,以获得: AX AY AZ BX BY BZ CX CY CZ 结果的顺序并不重要,例如AX、BX、。。。好的 我看到的大多数示例都使用剪切粘贴,但这只给出了我正在寻找的解决方案的一部分 我对任何方法都持开放态度,但如果可以在bashshell中实现,我更愿意这样做 非常感谢 JPG可以这样

我不是一个经验丰富的程序员,我还没有找到解决以下问题的方法。请原谅,如果我的措辞不正确,这可能是我的搜索问题

我有两个单列文件

A
B
C

我想创建一个文件,将第二列的每个元素附加到第一列的每个元素,以获得:

AX
AY
AZ
BX
BY
BZ
CX
CY
CZ
结果的顺序并不重要,例如AX、BX、。。。好的

我看到的大多数示例都使用剪切粘贴,但这只给出了我正在寻找的解决方案的一部分

我对任何方法都持开放态度,但如果可以在bashshell中实现,我更愿意这样做

非常感谢

JPG可以这样做:

!/副秘书长/垃圾箱/环境卫生 file1='a.txt' file2='b.txt' array2=$cat${file2} 对于$cat${file1}中的i;做 对于${array2}中的j;做 echo${i}${j} 完成 完成
对于大文件,这可能会很慢,但这也很有效:

cat file1.txt | xargs -d ' ' -I var sh -c 'for i in `cat file2.txt`; do echo var$i; done'
编辑 通过先将第二个文件的内容写入变量,这可能会更有效

SECOND_FILE=$(cat file2.txt) | cat file1.txt | xargs -d ' ' -I var sh -c 'for i in `echo $SECOND_FILE`; do echo var$i; done'

如果您想了解此命令和其他命令,我建议您使用awk将每个文件中的值存储在一个数组中,然后使用一组嵌套的for循环简单地输出值

awk '
    FNR == NR {a[i++] = $1}
    FNR < NR {b[j++] = $1}
    END { 
        for (i in a)
            for (j in b)
                printf "%s%s\n", a[i], b[j] }
' file1 file2
您只需选择awk命令,然后用鼠标中键将其粘贴到您的终端进行测试,例如:

$ awk '
>     FNR == NR {a[i++] = $1}
>     FNR < NR {b[j++] = $1}
>     END {
>         for (i in a)
>             for (j in b)
>                 printf "%s%s\n", a[i], b[j] }
> ' file1 file2
AX
AY
AZ
BX
BY
BZ
CX
CY
CZ

您的问题将显示简洁、可测试的示例输入和预期输出,使用编辑器{}按钮进行格式化以确保可读性。如果您的输入是行分隔的,则不要显示逗号分隔的输入,并告诉我们其行分隔的输入-显示行分隔的输入。我们需要您提供输入/输出,我们可以按原样复制/粘贴以测试潜在的解决方案。当您说是否可以在bash shell中执行时,我更愿意这样做。-你的意思是使用bash内置程序吗?如果是,为什么?或者使用标准UNIX命令,如grep、sed、awk等?@jpg请检查我的编辑是否符合您的意图@Léa处理IFS的解决方案似乎是基于对您的问题设置的误读。在我提交答案后,问题设置发生了变化。由于文件1和文件2只引用了一次,我认为额外的引用没有多大意义。对于array1,也没有理由使用它——相反,cat命令可以很好地工作,而对于array2,可以合理地避免反复读取同一个文件。除此之外,这是最好、最清晰、最直接的解决方案+1.@userunknown应答更新为仅预取内部循环的array2中的文件2,但读取外部循环中的文件1
awk '
    FNR == NR {a[i++] = $1}
    FNR < NR {b[j++] = $1}
    END { 
        for (i in a)
            for (j in b)
                printf "%s%s\n", a[i], b[j] }
' file1 file2
AX
AY
AZ
BX
BY
BZ
CX
CY
CZ
$ awk '
>     FNR == NR {a[i++] = $1}
>     FNR < NR {b[j++] = $1}
>     END {
>         for (i in a)
>             for (j in b)
>                 printf "%s%s\n", a[i], b[j] }
> ' file1 file2
AX
AY
AZ
BX
BY
BZ
CX
CY
CZ