为文件的每一行添加来自其他文件的前缀

为文件的每一行添加来自其他文件的前缀

我有两个文件,分别名为 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)))

我们在哪里:

  • 结合yeshead制作一个sed脚本,该脚本将打印中每一行的file1.txt次数等于中的行数file2.txt
  • 结合yeshead使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

相关内容