如何使用bash

时间:2018-01-10 15:57:26

标签: bash

我希望在bash中合并两个文本文件,以便将一个文件中的每一行与另一个文件中的每个文件合并。

FILE1.TXT

abc123
def346
ghj098

FILE2.TXT

PSYC1001
PSYC1002
PSYC1003

我希望将它们组合起来,以便将file1的第1行添加到file2的每一行,并在它们之间使用管道去限制器|

e.g。

PSYC1001|abc123
PSYC1002|abc123
PSYC1003|abc123

然后对于file1中的其他行也一样,所以我最终会用

PSYC1001|abc123
PSYC1002|abc123
PSYC1003|abc123
PSYC1001|def346
PSYC1002|def346
PSYC1003|def346
PSYC1001|ghj098
PSYC1002|ghj098
PSYC1003|ghj098<

我在bash中通过复制此站点中的示例来做类似的简单文本操作,但我找不到可以执行此操作的示例。很想听听你的建议。我知道它一定很简单,但我还没有解决它。

4 个答案:

答案 0 :(得分:5)

最短的一个 - join 命令:

join -j2 -t'|' -o2.1,1.1 file1 file2
  • -t'|' - 输入/输出字段分隔符
  • -o FORMAT - FORMAT是一个或多个逗号或空格分隔的规范,每个规范都是FILENUM.FIELD0

输出:

PSYC1001|abc123
PSYC1002|abc123
PSYC1003|abc123
PSYC1001|def346
PSYC1002|def346
PSYC1003|def346
PSYC1001|ghj098
PSYC1002|ghj098
PSYC1003|ghj098

答案 1 :(得分:4)

这个awk单行应该可以帮到你:

awk -v OFS="|" 'NR==FNR{a[NR]=$0;c=NR;next}{for(i=1;i<=c;i++){print a[i],$0}}' file2 file1

使用您的数据进行测试:

kent$  awk -v OFS="|" 'NR==FNR{a[NR]=$0;c=NR;next}{for(i=1;i<=c;i++){print a[i],$0}}' f2 f1
PSYC1001|abc123
PSYC1002|abc123
PSYC1003|abc123
PSYC1001|def346
PSYC1002|def346
PSYC1003|def346
PSYC1001|ghj098
PSYC1002|ghj098
PSYC1003|ghj098 

答案 2 :(得分:3)

以下是使用普通bash执行此操作的两种方法:

while IFS= read -u3 -r elem1; do 
    while IFS= read -u4 -r elem2; do 
        echo "$elem2|$elem1"
    done 4<file2.txt
done 3<file1.txt
mapfile -t f1 < file1.txt
mapfile -t f2 < file2.txt
for elem1 in "${f1[@]}"; do 
    for elem2 in "${f2[@]}"; do 
        echo "$elem2|$elem1"
    done
done

答案 3 :(得分:1)

仅限bash

a1=( $(<f1) )
a2=( $(<f2) )

for i in "${a2[@]}"
do
 for j in "${a1[@]}"
  do
   echo "${j}|${i}"
 done
done