Regex bash:清理和合并数据
我有三个csv文件,其中包含一个公共对象的不同数据。这些数据表示关于工作项的不同集合的数据。这些对象具有唯一的代码。文件的数量并不重要,所以我将用两个文件来解决这个问题。我有一个使用Regex bash:清理和合并数据,regex,bash,perl,awk,data-science,Regex,Bash,Perl,Awk,Data Science,我有三个csv文件,其中包含一个公共对象的不同数据。这些数据表示关于工作项的不同集合的数据。这些对象具有唯一的代码。文件的数量并不重要,所以我将用两个文件来解决这个问题。我有一个使用join连接这些文件的简便方法,但是清洁部分让我很痛苦 文件片段-包含唯一的数据。还有编目错误eb B 547 J 65 EB 289 E B 1 CO 8900 ZX 7 文件B代码段-关于对象不同维度的唯一数据 B 5 ZX 67 SD 4 CO 76 J 54
join
连接这些文件的简便方法,但是清洁部分让我很痛苦
文件片段-包含唯一的数据。还有编目错误eb
B 547
J 65
EB 289
E B 1
CO 8900
ZX 7
文件B代码段-关于对象不同维度的唯一数据
B 5
ZX 67
SD 4
CO 76
J 54
EB 10
请注意,文件B包含与文件a不相同的代码
现在,我向你们提交为这组物体指定的“官方”法典:
B
CO
ZX
J
EB
请注意,文件B包含一个包含数据的非规范代码。它需要被捕获和记录。与文件A中的错误代码相同
最终目标:使用多个报告中的各个字段对集合运行趋势和统计数据。它们大多与佳能相匹配,但由于编目错误和不再使用的代码,它们也有一些奇怪之处
合并/加入后的最终目标结果:
B 547 5
J 65 54
EB 289 10
CO 8900 76
ZX 7 67
因此,我的第一个想法是使用grep-F-F
进行搜索,使用规范代码作为搜索列表,然后与join
合并。问题是,对于单字母代码,它太包容了。这看起来像是一项针对awk
的工作,它可以使用tab
分隔符和REGEX
奇怪的代码。但我不知道如何获得awk
以使用列表筛选其他文件。join
单独处理这一切吗?也许我会合并加入
或粘贴
,然后筛选出怪人?哪种方法最不脆弱,更容易处理像醉酒编目器这样的边缘情况
如果您在想,“伙计,这最好用Perl或Python来完成……等等。”。我洗耳恭听。没有规则,我只需要交付 你的问题说数据是csv,但根据你的样本,我假设它是tsv。我还假设
eb
应该在异常值输出中结束,NA值应该用0
填充
考虑到这些假设,以下内容可能就足够了:
sort -t $'\t' -k 1b,1 fileA > fileA.sorted && sort -t $'\t' -k 1b,1 fileB > fileB.sorted
join -t $'\t' -a1 -a2 -e0 -o auto fileA.sorted fileB.sorted > out
grep -f codes out > out-canon
grep -vf codes out > out-oddball
文件代码的内容
:
^B\s
^CO\s
^ZX\s
^J\s
^EB\s
结果:
$ cat out-canon
B 547 5
CO 8900 76
EB 289 10
J 65 54
ZX 7 67
$ cat out-oddball
E B 1 0
SD 0 4
$cat out佳能
B 547 5
CO 8900 76
EB 289 10
J 65 54
ZX767
$cat out古怪的家伙
E B 10
SD 0 4
你的问题说数据是csv,但根据你的样本,我假设它是tsv。我还假设
eb
应该在异常值输出中结束,NA值应该用0
填充
考虑到这些假设,以下内容可能就足够了:
sort -t $'\t' -k 1b,1 fileA > fileA.sorted && sort -t $'\t' -k 1b,1 fileB > fileB.sorted
join -t $'\t' -a1 -a2 -e0 -o auto fileA.sorted fileB.sorted > out
grep -f codes out > out-canon
grep -vf codes out > out-oddball
文件代码的内容
:
^B\s
^CO\s
^ZX\s
^J\s
^EB\s
结果:
$ cat out-canon
B 547 5
CO 8900 76
EB 289 10
J 65 54
ZX 7 67
$ cat out-oddball
E B 1 0
SD 0 4
$cat out佳能
B 547 5
CO 8900 76
EB 289 10
J 65 54
ZX767
$cat out古怪的家伙
E B 10
SD 0 4
试试这个(GNU awk):
它将创建error.fileA
,oddball.fileA
如果存在这样的行,oddball.fileB
正常输出未写入文件,当结果正常时,您可以自己使用
写入:
B 547 5
J 65 54
EB 289 10
CO 8900 76
ZX 7 67
SD 0 4 (? maybe?)
很难阅读您的描述,不确定这是否是您想要的。无论如何,改进这个awk代码很容易 您可以更改为
FILENAME==“file1”
,或者FILENAME==ARGV[1]
如果argid
不起作用。试试这个(GNU awk):
它将创建error.fileA
,oddball.fileA
如果存在这样的行,oddball.fileB
正常输出未写入文件,当结果正常时,您可以自己使用
写入:
B 547 5
J 65 54
EB 289 10
CO 8900 76
ZX 7 67
SD 0 4 (? maybe?)
很难阅读您的描述,不确定这是否是您想要的。无论如何,改进这个awk代码很容易
如果
argid
不工作,您可以更改为FILENAME==“file1”
,或者FILENAME==ARGV[1]
。那么为什么SD
条目在所需的输出中是一个奇怪的条目,而eb
条目则不是?@cody我正在讨论如何显示数据。我想我应该把它们拉出来,分别呈现出来,因为我的数学例程不会产生任何有价值的东西,因为它们会缺少关键字段。那么为什么SD
条目作为一个奇怪的输出出现在所需的输出中,而eb
条目则不是呢?@cody我正在讨论如何呈现数据。我想我应该把它们拿出来单独展示,因为我的数学例程不会产生任何有价值的东西,因为它们会缺少关键字段。它是用制表符分隔的。我不确定你的grep-f
在E
是规范的,eb
是文件中的编目器错误的情况下是否有效。这就是我一直遇到的。啊,我明白了。您在代码文件中添加了正则表达式。聪明!好的,我马上就要考试了,考试成功后我会打勾的。很肯定这会奏效。代码文件中的正则表达式几乎可以扣篮,并大大降低脆弱性。与此同时……投票结果是一致的!谢谢在eb
上中断,但我用\t
替换了\s
,它现在可以工作了。它是以制表符分隔的。我不确定你的grep-f
在E
是规范的并且eb
是文件中编目器错误的情况下是否可以工作。这就是我一直遇到的。啊,我明白了。您在代码文件中添加了正则表达式。聪明!好的,我马上就要考试了,考试成功后我会打勾的。很肯定这会奏效。代码文件中的正则表达式几乎可以扣篮,并大大降低脆弱性。与此同时……投票结果是一致的!谢谢在eb
上中断,但我用\t
替换了\s
,它现在可以工作了。