![根据白名单过滤大型文本文件中的条目](https://linux22.com/image/1292873/%E6%A0%B9%E6%8D%AE%E7%99%BD%E5%90%8D%E5%8D%95%E8%BF%87%E6%BB%A4%E5%A4%A7%E5%9E%8B%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E6%9D%A1%E7%9B%AE.png)
你好。我真的很需要你的帮助。我有一个以下格式的统计文本文件。
ID=1000000
Name=Name1
Field1=Value1
...(Fields 2 to 25)
Field26=Value26
ID=1000001
Name=Name2
Field1=Value1
...(Fields 2 to 25)
Field26=Value26
ID=1000002
Name=Name2
Field1=Value1
...(Fields 2 to 25)
Field26=Value26
...goes up to 15000
我有一个由换行符分隔的活跃人物文本文件。
Name2
Name5
Name11
Name12
...goes up to 1400 Random Names
如果在活跃人员文本文件中找不到姓名,我需要能够从统计文本文件(ID、姓名、字段 1 至 26)中删除记录。在上面的示例中,应该删除与姓名 1(ID、姓名、字段 1 至 26)相关的记录,因为它不在活跃人员文本文件中。
我尝试通过 notepad++ 重新格式化统计文件,使用 TextFX->Quick->Find/Replace 将其转换为逗号分隔的文件,每个记录都用换行符分隔。我将其重新排列为
ID Name Field1 ...Fields2 to Fields 25... Field26
1000000 Name1 Value1 ...Value2 to Value 25... Value26
1000001 Name2 Value1 ...Value2 to Value 25... Value26
1000002 Name3 Value1 ...Value2 to Value 25... Value26
我用 excel 打开了它,并使用 csv 文件在 mysql 中创建了两个表(统计表和活动名称表)。我不确定如何在自动函数中处理它。除了删除不活动的记录外,我遇到的另一个问题是将其重写回旧格式。
我已经花了几个小时尽力解决这个问题。有没有一种解决方案不需要我在两个文件之间使用查找、复制、粘贴和切换 1400 次?我愿意使用不同的方法/程序来简化这个过程。不幸的是,我必须将统计文件保留为这种格式。
我遇到了这个问题。请帮忙。谢谢。
答案1
在几乎任何 BSD 或 Linux 系统上(我在 OS X 上编写了此代码),你都可以使用以下 bash 脚本filter.sh
:
#!/bin/bash
if [ ! -f "$1" ] ; then
echo "First argument must be active users list file"
exit 1
fi
while read line
do
if [ "$( grep -E "^$( echo $line | cut -d' ' -f2 )$" "$1" )" ] ; then
echo $line
fi
done
将原始活跃用户列表存储为active.txt
修改后的统计文件,使用以下命令stats.txt
使之可执行并运行它:filter.sh
chmod +x filter.sh
$ < stats.txt ./filter.sh active.txt | tee result.txt
1000001 Name2 Value1 ...Value2 to Value 25... Value26
它会将活动统计条目打印到标准输出并将其写入result.txt
。
答案2
编辑:我误解了问题中关于 csv 的部分。我只是想讨论输出部分。
Excel 不是数据库/记录集范例。除了 Excel,您还可以使用 Access,或者使用 OpenOffice 中的 Base 之类的东西(http://www.openoffice.org/product/base.html)。将文件导入为表格,链接表格,执行[魔法],导出新文件。
在 Access 中,疯狂的输出文件的方法是创建一个查询来构建您想要的字符串:
Select
"ID=" & [id] & chr(13) & chr(10) &
"Name=" & [Name1] & chr(13) & chr(10) &
( ... )
"Field26=" & [Value26] & chr(13) & chr(10) &
FROM fooTable
然后保存它,然后将其导出到文本文件。这将创建一个每条记录一个字段的查询。13+10 是 Windows 回车符+换行符组合。
不优雅。