在两列中搜索两个不同的字符串

时间:2013-08-23 09:21:24

标签: linux string shell multiple-columns

我正在使用shell我有一个3列的文件,想要我想要搜索2和3列中的两个不同的字符串。我认为awk会很有用,但我找不到合适的方法。

输入文件:

0000: 3.302295  22.508675
0001: 2.913368  14.100854
0002: 3.530211  19.428879
0003: 3.239985  16.981230
0004: 3.088717  25.245083
0005: 3.156010  3.785273

我想给出两个搜索字符串,如3.30和22.5,并将第一行作为输出

  

0000:3.302295 22.508675

由于

3 个答案:

答案 0 :(得分:0)

这个怎么样?

#!/bin/bash

if [ ! $# -eq 2 ]; then
    echo "Wrong number of parameters"
    exit 
fi

awk -v str1=$1 -v str2=$2 '
{
    if (match($2, "^" str1) && match($3, "^" str2)) {
            print $0;
    }
}'

示例:

./search.sh 3.175399 21.913555 < input.txt  

我假设上面的脚本名为search.sh,输入的内容是input.txt。

更新:根据glenn jackman的建议添加了正则表达式锚点

答案 1 :(得分:0)

这应该适合你:

awk -F, '{ if ( $2 == "\"3.30\"" && $3 == "\"22.5\"" ) print $0 }' <filename>

我希望它有所帮助! :)

答案 2 :(得分:0)

一个简单的grep看起来可能会起作用:

#!/bin/bash

echo -n "First number : "
read n1
echo -n "Second number : "
read n2

# Match lines containing first number, any number of characters, and second number.
grep "$n1.*$n2"  your_file

但是这段代码有点过于简单了。也许你想输入像3和1这样的整数......在这种情况下,每一行包含一个3后跟一个1的地方就会匹配。考虑到这一点,这是一个解决方案:

#!/bin/bash

echo -n "First number : "
read n1
echo -n "Second number : "
read n2

# Adding decimal separators in case of whole numbers
if [[ $n1 != *.* ]]
then
    n1=${n1}\\.
fi

if [[ $n2 != *.* ]]
then
    n2=${n2}\\.
fi

# Match lines containing first number, any number of characters, and second number.
grep "$n1.*$n2"  your_file