搜索多个模式的第一次和最后一次出现

时间:2015-10-30 20:18:42

标签: string grep pattern-matching

我想知道是否有人可以帮助我将shell命令简化为一行或两行,我们可以使用awk或sed来简化执行,在执行过程中更好的性能是非常有用的

输入文件

    PATTERN1 xxx
    PATTERN2 xxx
    PATTERN3 xxx
    PATTERN1 yyy
    PATTERN2 yyy
    PATTERN3 yyy
    PATTERN1 zzz
    PATTERN2 zzz
    PATTERN3 zzz

我的剧本:

    echo "First occurance..."
    grep -m1 "PATTERN1" $fileName
    grep -m1 "PATTERN2" $fileName
    grep -m1 "PATTERN3" $fileName

    echo "Last occurance..."
    tac $fileName | grep -m1 "PATTERN1"
    tac $fileName | grep -m1 "PATTERN2"
    tac $fileName | grep -m1 "PATTERN3"

输出

    PATTERN1 xxx
    PATTERN2 xxx
    PATTERN3 xxx
    PATTERN1 zzz
    PATTERN2 zzz
    PATTERN3 zzz

提前致谢

2 个答案:

答案 0 :(得分:0)

Just two commands:

$ awk '/PATTERN[1-3]/ && !seen[$1]++' file
    PATTERN1 xxx
    PATTERN2 xxx
    PATTERN3 xxx

$ tac file | awk '/PATTERN[1-3]/ && !seen[$1]++'
    PATTERN3 zzz
    PATTERN2 zzz
    PATTERN1 zzz

This prints a match the first time it is seen.

答案 1 :(得分:0)

如果您想继续使用grep,可以使用xargs

让我们把模式放在一个变量

patterns=`echo "PATTERN"{1..3} | tr ' ' '\n'`
# or
patterns="PATTERN1\nPATTERN1\nPATTERN3"

现在我们可以这样做:

echo -e "$patterns" | xargs -l sh -c 'cat '$inputFile' | grep -m1 "$0"'
echo -e "$patterns" | xargs -l sh -c 'tac '$inputFile' | grep -m1 "$0"'