我希望在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
中通过复制此站点中的示例来做类似的简单文本操作,但我找不到可以执行此操作的示例。很想听听你的建议。我知道它一定很简单,但我还没有解决它。
答案 0 :(得分:5)
最短的一个 - join
命令:
join -j2 -t'|' -o2.1,1.1 file1 file2
-t'|'
- 输入/输出字段分隔符-o FORMAT
- FORMAT
是一个或多个逗号或空格分隔的规范,每个规范都是FILENUM.FIELD
或0
输出:
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