将文件从一个文件搜索到另一个文件中

时间:2013-06-09 20:22:36

标签: regex sed awk grep

file1的数字分为四列,每列有16位数字:

5150782703810496 7071783126930570 9776701040412294 4414890272061604
6426318539518073 5261792065926013 6303463168130122 8332314317620078
7506133106243886 2242241367012197 8275982207923757 7263931623813806
8882831187329643 3184441663826305 1416431572523093 0697142167966828

file2我有16种搜索模式(按偶然排序),file1中的每个数字都有一种:

0412294
062438
118732964
157252
17831269305
23813806
24224136701
3323143
381049
441489027206160
441663826305
5926013
66828
68130
82207923
8539518073

现在,我正在寻找一个解决方案,为rowcolumn的每个模式查找file2file1file3中的所需结果:

1,1=381049
1,2=17831269305
1,3=0412294
1,4=441489027206160
2,1=8539518073
2,2=5926013
2,3=68130
2,4=3323143
3,1=062438
3,2=24224136701
3,3=82207923
3,4=23813806
4,1=118732964
4,2=441663826305
4,3=157252
4,4=66828

我使用grep -f file2 file1进行了尝试,找到了row但没有column。我在Windows上,希望awkgrepsed,并且不能使用PerlBash。怎么做到这一点?谢谢!

4 个答案:

答案 0 :(得分:4)

输出未排序。 Birei's解决方案完全符合您的需求。

awk '
NR==FNR {
    for (i=1;i<=NF;i++) {
        a[$i]=NR","i 
    }
    next
} 
{ 
    b[$1] 
} 
END {
    for (x in a) { 
        for (y in b) {
            if (index(x,y)>0) {
                print a[x]"="y
            }
        }
    }
}' file1 file2

输出:

4,4=66828
4,1=118732964
3,3=82207923
4,3=157252
4,2=441663826305
2,4=3323143
1,1=381049
2,1=8539518073
3,2=24224136701
1,3=0412294
2,3=68130
1,2=17831269305
2,2=5926013
1,4=441489027206160
3,1=062438
3,4=23813806

答案 1 :(得分:4)

这可能适合你(GNU sed):

sed 's|.*|s/(.*=).*(&).*/\\1\\2/p|' file2 |
sed -nrf - <(sed = file1 | sed -r 'N;s/^(.*)\n(\S+)\s(\S+)\s(\S+)\s(\S+)/\1,1=\2\n\1,2=\3\n\1,3=\4\n\1,4=\5/') >file3

file1转换为每行包含一组数字的文件,并添加行号和行。 从file2创建一个sed脚本并针对上述文件输出运行它。 但是,由于你在Windows上,我猜你需要将每一步分成一个单独的文件并分三步运行。

答案 2 :(得分:3)

解决方案。

script.awk的内容:

FNR == NR {
    patterns[ $1 ] = 1 
    next
}

{
    for ( i = 1; i <= NF; i++ ) { 
        for ( p in patterns ) { 
            if ( index( $i, p ) > 0 ) { 
                printf "%d,%d=%s\n", FNR, i, p
                delete patterns[ p ] 
                break
            }   
        }   
    }   
}

像以下一样运行:

awk -f script.awk file2 file1

产量:

1,1=381049
1,2=17831269305
1,3=0412294
1,4=441489027206160
2,1=8539518073
2,2=5926013
2,3=68130
2,4=3323143
3,1=062438
3,2=24224136701
3,3=82207923
3,4=23813806
4,1=118732964
4,2=441663826305
4,3=157252
4,4=66828

答案 3 :(得分:1)

你可以创建一个bash脚本(你没有规则bash out),如:

IFS=$'\n'
lnum=0
for line in $(cat file1); do
    lnum=$(( lnum + 1 ))
    cnum=0
    IFS=' '
    for entry in $line; do
        cnum=$(( cnum + 1 ))
        IFS=$'\n'
        for pattern in $(cat file2); do
            if [[ $entry =~ ^.*${pattern}.*$ ]]; then
                echo "${lnum},${cnum}=${pattern}"
                break
            fi
        done
    done
done