我有以下脚本:
#!/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
这是输入.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
命令做到这一点吗?你还有其他想法吗?可能正在逐行阅读?
使用 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
你可以处理这些数据。