我有两个文件,分别名为 file1.txt 和 file2.txt,我试图以某种方式将 file1.txt 的前缀添加到 file2.txt 中这样我就可以把结果传到我正在使用的下一个实用程序。
cat file1.txt
aa
bb
cc
cat file2.txt
site.com
site2.com
site3.com
预期结果如下:
aa.site.com
aa.site2.com
aa.site3.com
bb.site.com
bb.site2.com
bb.site3.com
cc.site.com
cc.site2.com
cc.site3.com
答案1
使用 bash:
while IFS= read -r line1; do while IFS= read -r line2; do echo "$line1.$line2"; done <file2.txt; done <file1.txt
或者
join -j 64 <(sort file1.txt) <(sort file2.txt) -o 1.1,2.1 | sed 's/ /./'
输出:
网站 AA.site2.com AA.site3.com bb.site.com bb.site2.com bb.site3.com cc.site.com cc.site2.com cc.site3.com
答案2
最简单的部分是您可以使用paste
来合并文件的行。它的-d
选项允许您选择分隔符(此处为.
)。
这里的难点是笛卡尔积。借用这个答案,我们可以得出这样的命令:
paste -d '.' \
<(sed -n "$(yes 'p;' | head -n $(wc -l <file2.txt) )" file1.txt) \
<(cat $(yes 'file2.txt' | head -n $(wc -l <file1.txt)))
我们在哪里:
- 结合
yes
和head
制作一个sed
脚本,该脚本将打印中每一行的file1.txt
次数等于中的行数file2.txt
; - 结合
yes
和head
使cat
打印file2.txt
次数等于中的行数file1.txt
; - 使用
paste
合并两个进程替换 ( ) 打印的每对行<(...)
,用 分隔.
。
当然,你可以将结果通过管道传输到其他命令中。
另外,请注意,你始终可以通过管道传输命令的输出,即使它们处于循环中,例如另一个答案你有。例如尝试
while ... do ... done <file | cat -
为了方便起见,您可以定义一个函数并使其可用于您的环境(例如,.bashrc
如果您使用 ,则在您的环境中定义它bash
)。
这里有一个示例,使用循环来最大限度地减少对外部工具的需求:
function cart_prod () {
while IFS= read -r line1; do
while IFS= read -r line2; do
printf '%s.%s\n' "$line1" "$line2"
done <"$2"
done <"$1"
}
使用示例:
$ cart_prod file1.txt file2.txt | sort -r
cc.site.com
cc.site3.com
cc.site2.com
bb.site.com
bb.site3.com
bb.site2.com
aa.site.com
aa.site3.com
aa.site2.com