如何在一个简单的bash脚本中正确解析这个场景?

时间:2011-03-23 19:58:08

标签: bash shell unix

我有一个文件,其中每个键值对占用一个新行。每个键都有可能有多个值。我想返回所有具有“特殊键”的对的列表,其中“特殊”被定义为某个函数。

例如,如果将“special”定义为某处某个值为100

的键
A 100
B 400
A hello
B world
C 100

我会回来

A 100
A hello
C 100

如何在bash中执行此操作?

5 个答案:

答案 0 :(得分:1)

#!/bin/bash

special=100    

awk -v s=$special '
{
  a[$1,$2]
  if($2 ~ s)
    k[$1]
}

END
{
  for(key in k)
    for(pair in a)
    {
      split(pair,b,SUBSEP)
        if(b[1] == key)
          print b[1],b[2]
    }
}' ./infile

概念证明

$ special=100; echo -e "A 100\nB 400\nA hello\nB world\nC 100" | awk -v s=$special '{a[$1,$2];if($2 ~ s)k[$1]}END{for(key in k)for(pair in a){split(pair,b,SUBSEP); if(b[1] == key)print b[1],b[2]}}'
A hello
A 100
C 100

答案 1 :(得分:1)

这也有效:

id=`grep "\<$special\>$" yourfile | sed -e "s/$special//"`
[ -z "$id" ] || grep "^$id" yourfile

<强>返回:

如果special=100

A 100
A hello
C 100

如果special="hello"

A 100
A hello

如果special="A"

(nothing)

如果special="ello"

(nothing)

备注

  • 如果您想要部分匹配,请删除\<\>
  • 如果同一对(| uniqA 100,......)有多个入口可能会在最后添加A 100,但您不希望在输出。

答案 2 :(得分:1)

** * ** 脚本 * ** * *

#!/bin/bash

grep " $1" data.txt | cut -d ' ' -f1 | grep -f /dev/fd/0 data.txt

结果:

./test.sh 100

A 100
A hello
C 100

** * ** 内嵌 * ** **

第一个grep必须包含以空格''开头的'special':

grep " 100" data.txt | cut -d ' ' -f1 | grep -f /dev/fd/0 data.txt

A 100
A hello
C 100

答案 3 :(得分:1)

awk -v special="100" '$2==special{a[$1]}($1 in a)' file

答案 4 :(得分:0)

呼!我的bash非常生锈!希望这会有所帮助:

FILE=$1
IFS=$'\n' # Internal File Sep, so as to avoid splitting in whitespaces
FIND="100"
KEEP=""

for line in `cat $FILE`; do
    key=`echo $line | cut -d \  -f1`;
    value=`echo $line | cut -d \  -f2`;

    echo "$key = $value"

    if [ "$value" == "$FIND" ]; then
            KEEP="$key $KEEP"
    fi
done

echo "Keys to keep: $KEEP"

# You can now do whatever you want with those keys.