-1

我正在使用 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

谢谢

4

3 回答 3

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 的建议添加了正则表达式锚

于 2013-08-23T10:17:13.133 回答
0

这应该适合你:

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

我希望它有帮助!:)

于 2013-08-23T10:18:32.420 回答
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
于 2013-08-23T10:23:23.317 回答