2012-04-24 1 views
4

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

ファイルA:

cool 
beans 
sad 

ファイルB:

armadillo 
snake 
bread 

新しいファイル:

coolsnake 
coolbread 
beanssnake 
beanbread 
sadsnake 
sadbread 
+0

はこの宿題ですか? @sysmana、noope。 – lesmana

+3

私は絶望的にクールな言葉を作成しようとしています。 – n0pe

答えて

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 
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' 

そのような何か、ちょうどそれが私に与え 自分自身でそれに合う:perlを使用して

coolsnake 
coolbread 
beanssnake 
beansbread 
sadsnake 
sadbread 
+2

+1ですが、 '[[$ {#line2} -lt 7]] && echo $ line1 $ line2'を文字列の長さの比較に使用することをお勧めします。 – anubhava

+0

ええ、それは良い、おそらくより速いです。 – remort

+0

@anubhava:Bashでは、整数比較にこの形式を使用することをお勧めします。 '(($ {#line2} <7))'です。 –

1

一つの方法:

コンテンツをo F 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; 
    } 
} 

ランはそれが好き:

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 
1

:以下の出力で

perl script.pl fileA fileB 

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

はsedを:

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

Bash 4が必要です。 –

2

これはあなたのために働くかもしれない:bashの持つ

coolsnake 
coolbread 
beanssnake 
beansbread 
sadsnake 
sadbread 
関連する問題