3

我有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

现在我正在寻找一种解决方案来查找in 中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 上,更喜欢awkgrep或者sed不能使用PerlBash不幸的是。如何做到这一点?谢谢!

4

4 回答 4

4

输出未排序。Birei 的解决方案正是您所需要的。

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
于 2013-06-09T21:00:13.590 回答
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 上,我想您需要将每个步骤分成一个单独的文件并分三个步骤运行。

于 2013-06-09T21:42:10.923 回答
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
于 2013-06-09T20:41:35.780 回答
1

您可以创建一个 bash 脚本(您没有排除 bash),例如:

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
于 2013-06-09T20:38:47.147 回答