我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
现在,我正在寻找一个解决方案,为row
中column
的每个模式查找file2
和file1
。 file3
中的所需结果:
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上,希望awk
,grep
或sed
,并且不能使用Perl
和Bash
。怎么做到这一点?谢谢!
答案 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)
awk解决方案。
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