我正在使用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
由于
答案 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