我有两个文件。文件A
有一个单词列表,每行一个。文件B
包含另一个巨大的单词列表,但有些单词很长。我如何使用sed或awk从文件A
中获取每一行,并将其与文件B
中不超过6个字符的每一行组合?理想情况下,它会在新文件中吐出所有结果。
例如:
档案A:
cool
beans
sad
档案B:
armadillo
snake
bread
新文件:
coolsnake
coolbread
beanssnake
beanbread
sadsnake
sadbread
答案 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