Regex bash:清理和合并数据

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

我有三个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
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
,它现在可以工作了。