如何使用sed或awk将两个文件的每一行组合在一起?

时间:2012-04-24 19:09:35

标签: linux shell sed awk

我有两个文件。文件A有一个单词列表,每行一个。文件B包含另一个巨大的单词列表,但有些单词很长。我如何使用sed或awk从文件A中获取每一行,并将其与文件B中不超过6个字符的每一行组合?理想情况下,它会在新文件中吐出所有结果。

例如:

档案A:

cool
beans
sad

档案B:

armadillo
snake
bread

新文件:

coolsnake
coolbread
beanssnake
beanbread
sadsnake
sadbread

5 个答案:

答案 0 :(得分:4)

与输出的顺序不同,但可能有用:

awk '
  FNR == NR { 
    words[ $1 ] = 1; 
      next 
  } 
  FNR < NR { 
    if ( length( $1 ) <= 6 ) 
      for ( word in words ) { 
        print word $0 
       } 
  }
' fileA fileB

输出:

coolsnake
sadsnake
beanssnake
coolbread
sadbread
beansbread

答案 1 :(得分:2)

#!/bin/bash

while read line1; do
 while read line2;do
   [[ $(echo $line2 | wc -c) -lt 7 ]] && \
   echo $line1$line2
 done < './B.txt'
done < './A.txt'
像这样的东西,适合自己 它给了我:

coolsnake
coolbread
beanssnake
beansbread
sadsnake
sadbread

答案 2 :(得分:2)

这可能对您有用:

sed 's|.*|sed "/......./d;s/.*/&\&/" fileB|' fileA | sh

使用GNU sed:

sed 's|.*|sed "/......./d;s/.*/&\&/" fileB|e' fileA

答案 3 :(得分:1)

使用perl的一种方式:

script.pl的内容:

use warnings;
use strict;

die qq[Usage: perl $0 <fileA> <fileB>\n] unless @ARGV == 2;

open my $fh, q[<], pop or die $!;

my @words = map { chomp; $_ } grep { length( $_ ) <= 6 } <$fh>;

while ( <> ) {
    chomp;
    for my $word ( @words ) {
        printf qq[%s\n], $_ . $word;
    }
}

像以下一样运行:

perl script.pl fileA fileB 

使用以下输出:

coolsnake
coolbread
beanssnake
beansbread
sadsnake
sadbread

答案 4 :(得分:1)

使用bash:

mapfile -t shortwords < <(sed -r 's/.{7,}/d' B.txt)
while read word; do
  for suffix in "${shortwords[@]}"; do
    echo "$word$suffix"
  done
done < A.txt
相关问题