我有一个文件,其中每个键值对占用一个新行。每个键都有可能有多个值。我想返回所有具有“特殊键”的对的列表,其中“特殊”被定义为某个函数。
例如,如果将“special”定义为某处某个值为100
的键A 100
B 400
A hello
B world
C 100
我会回来
A 100
A hello
C 100
如何在bash中执行此操作?
答案 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)
备注强>
\<\>
| uniq
,A 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.