只保存两个greps合并中的第一个匹配项?

时间:2014-02-28 08:48:58

标签: regex bash sed awk grep

我有以下脚本:

#!/bin/bash

echo "INPUT"
echo 

# Grep array 1
grep -v '.*SYSTSIN' input.txt | grep -oPh '(?!.*?\.tmp)[^|]+\|\s+\K[^|]+(?=\|\s+OK.*?\[INPUT)' |  uniq -i |
while read file; do
    echo "$file"
done

echo
echo "OUTPUT"
echo 

# Greap array 2
grep -Poh '(?!.*?\.tmp)[^|]+\|\s+\K[^|]+(?=\|\s+OK.*?\[OUTPUT)' input.txt | uniq -i |
while read file; do
    echo "$file"
done

这是input.txt文件中的内容:

 234234 |  robert.txt| OK|  INFO| [INPUT]
  54656 |   maria.txt| OK|  INFO| [OUTPUT]
 078978 |   maria.txt| OK|  INFO| [INPUT]
      8 |  robert.txt| OK|  INFO| [OUTPUT]
     57 |   steve.txt| OK|  INFO| [INPUT]
    567 |   steve.txt| OK|  INFO| [OUTPUT]
  09832 |   marta.txt| OK|  INFO| [OUTPUT]
     99 |   marta.txt| OK|  INFO| [INPUT]
    ASD |    nick.txt| OK|  INFO| [INPUT]
    RFE |   jesus.txt| OK|  INFO| [OUTPUT]

打印结果是:

INPUT

robert.txt
maria.txt
steve.txt
marta.txt
nick.txt

OUTPUT

maria.txt
robert.txt
steve.txt
marta.txt
jesus.txt

现在我想去的只是第一次出现每个文件名并将其保存在相应的数组中。 我的意思是:如果匹配保存在两个数组中的一个中,则此文件名的所有匹配项都将被忽略。

根据这些条件,我正在寻找的结果是:

INPUT

robert.txt
steve.txt
nick.txt

OUTPUT

maria.txt
marta.txt
jesus.txt

我可以使用awk命令吗?你还有其他想法吗?可能是逐行阅读吗?

1 个答案:

答案 0 :(得分:1)

使用awk,你可以构造一个关联数组,每个与之关联的文件是第一个数据(“输入”或“输出”):

awk -F"|" '{if(result[$2]==""){result[$2]=$5}} END{for(file in result){print result[file] file}}' input.txt|sort

这一个班轮给你这个输出:

[INPUT]    nick.txt
[INPUT]   steve.txt
[INPUT]  robert.txt
[OUTPUT]   jesus.txt
[OUTPUT]   maria.txt
[OUTPUT]   marta.txt

你可以处理这些数据。