【问题标题】:Search two different strings in two columns [closed]在两列中搜索两个不同的字符串[关闭]
【发布时间】:2013-08-23 09:21:24
【问题描述】:

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

谢谢

【问题讨论】:

  • 请提供一些示例输入和所需的输出。否则答案会太抽象,我猜。
  • 向我们展示 1)示例输入(3 cols 文件)2)两个搜索字符串,3)预期输出,4)更好的代码。

标签: linux string shell multiple-columns


【解决方案1】:

这个怎么样?

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

【讨论】:

  • 这个真的是我想要的东西!谢谢:-)
  • 必须小心:如果你想在单词的开头匹配,你需要一个正则表达式锚:awk -v str1="$1" -v str2="$2" 'match ($2, "^" str1) &amp;&amp; match($3, "^" str2)'
  • 谢谢!如果想要一系列值?比如第一个字符串从 4 到 6,第二个字符串从 2 到 4?
  • 您的脚本将有 4 个参数。因此if [ ! $# -eq 2 ]; then 将是if [ ! $# -eq 4 ]; then。那么 awk 命令将是 awk -v a=$1 -v b=$2 -v c=$3 -v d=$4 '$2 &gt;= a &amp;&amp; $2 &lt;= b &amp;&amp; $3 &gt;= c &amp;&amp; $3 &lt;= d'。要运行脚本,您应该键入:./search.sh 4 6 2 4 &lt; input.txt。希望对您有所帮助。
  • 谢谢!我非常理解关于 4 个参数的事实,但不知道如何表达输出,我的意思是我也可以使用 4 个匹配函数,但在这种情况下不会有一个值范围(从到),但只是完美的匹配,对吗?可能我误解了什么,但这是我第一次尝试使用 awk,所以请耐心等待。
【解决方案2】:

这应该适合你:

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

希望对你有帮助! :)

【讨论】:

    【解决方案3】:

    一个简单的 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
    

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 2015-09-22
      • 2019-09-29
      • 2015-12-22
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      相关资源
      最近更新 更多