我有以下脚本:
#!/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
命令吗?你还有其他想法吗?可能是逐行阅读吗?
答案 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
你可以处理这些数据。