我有一个超过100 k行的文本文件。下面提到的数据是我所拥有的文本文件的示例。我想对这些数据使用一些条件,并删除一些行。文本文件没有标题(ID,NAME,Code-1,code,2-code-3).我提到过供参考。如何使用shell脚本来实现这一点?
输入测试文件:
| ID | NAME | Code-1 | code-2 | code-3 |
| $$ | 5HF | 1E | N | Y |
| $$ | 2MU | 3C | N | Y |
| $$ | 32E | 3C | N | N |
| AB | 3CH | 3C | N | N |
| MK | A1M | AS | P | N |
| $$ | Y01 | 01 | F | Y |
| $$ | BG0 | 0G | F | N |条件:
如果代码-2 ='N‘和代码-1不等于( '3C’,'3B‘,'32’,'31‘,'3D’),则ID=‘$’‘
输出:
| ID | NAME | Code-1 | code-2 | code-3 |
| $$ | 5HF | 1E | N | Y |
| $$ | 2MU | 3C | N | Y |
| AB | 3CH | 3C | N | N |
| MK | A1M | AS | P | N |
| $$ | Y01 | 01 | F | Y |发布于 2021-04-25 06:42:01
当你问问题的时候,它会鼓励你展示自己的努力。但我明白,如果你是巴什的新手,这个问题可能会很复杂。这是我使用awk的解决方案。花了0.545s在我的电脑上处理137 K行(带有中等规格)。
awk '{
ID=$2; NAME=$4; CODE1=$6; CODE2=$8; CODE3=$10;
if (CODE2 == "N") {
if (CODE1 ~ /(3C|3B|32|31|3D)/) {
if (ID == "$$") {
if (CODE3 == "Y") {
print;
}
}
else {
print;
}
}
else {
if (ID == "$$") {
print;
}
}
}
else {
if (ID == "$$") {
if (CODE3 == "Y") {
print;
}
}
else {
print;
}
}}' file注意,它有某些限制:
( a)它用空格(而不是| )分隔值。它将适用于您的确切输入格式,但不会处理没有额外空格的输入行。
|$$|32E|3C|N|N|
|AB|3CH|3C|N|N| ( b)由于同样的原因,如果col有额外的空格,则命令将生成不正确的结果。
| $$ | 32E FOO | 3C | N | N |
| AB | 3CH BBT | 3C | N | N |https://stackoverflow.com/questions/67245194
复制相似问题