4

私は2つのファイルを持っています。ファイルAには、各行に 1 つずつ単語のリストがあります。ファイルBには別の膨大な単語リストが含まれていますが、かなり長いものもあります。sed または awk を使用して、ファイルから各行を取得し、それをファイル内の6 文字A以下の各行と結合するにはどうすればよいですか? Bすべての結果を新しいファイルに吐き出すのが理想的です。

例えば:

ファイル A:

cool
beans
sad

ファイル B:

armadillo
snake
bread

新しいファイル:

coolsnake
coolbread
beanssnake
beanbread
sadsnake
sadbread
4

5 に答える 5

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
于 2012-04-24T19:19:47.177 に答える
3

これはあなたのために働くかもしれません:

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

GNU sed の場合:

sed 's|.*|sed "/......./d;s/.*/&\&/" fileB|e' fileA
于 2012-04-24T20:39:18.193 に答える
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
于 2012-04-24T19:26:41.653 に答える
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
于 2012-04-24T19:49:00.110 に答える
1

バッシュで:

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
于 2012-04-24T19:52:38.953 に答える