Unix如何过滤文本文件以查找部分行中1到49个字符的重复项并仅保存一个

时间:2019-04-15 11:09:16

标签: shell sorting unix duplicates

我必须过滤多行数据并在1-49位字符中查找重复项。接下来的第一个重复项留在那里,否则重复项将被删除。 脚本必须在外壳脚本中。我读过有关uniq的sort的信息,但找不到正确的示例。

应删除从1到49个字符的重复行,并仅首先保存。 在示例行中:ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z24被重复4次,并且仅从第1行开始保存。

我有以下示例:

ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z24 1

ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z215

ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z225

ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z235

ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z24 2

ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z24 4

ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z24 5

输出应为:

ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z241

ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z215

ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z225

ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z235

1 个答案:

答案 0 :(得分:1)

如果您不介意首先对数据进行排序,可以使用sortawk的组合。在一组匹配的行中,这将对数据进行排序后打印第一行,而不一定是原始文件中的第一行。

sort inputfile |awk 'BEGIN { last = ""; }
{ pattern = substr($0,1,48); if(pattern != last) print; last = pattern; }'

注意:我使用substr($0,1,48)来获得48个字符,因为在您的示例中,我只计算了48个粗体字符。

使用输入

ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z241
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z215
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z225
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z235
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z242
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z244
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z245

我得到结果

ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z215
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z225
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z235
ALA1FZX 00013019040220180402SFOSINSFOSIN78Z78Z241