Shell Unix如何筛选文本文件以在部分行中查找1到49个字符的重复项并仅保存一个
我必须过滤多行数据,并在位置1-49字符处找到重复项。下一步,重复留在那里,否则重复项将被删除。 脚本必须在shell脚本中。我读过有关排序、uniq的文章,但找不到正确的例子 应从1到49个字符的重复行中删除并仅首先保存。 在示例行中:ALA1FZX 000130190402220180402SFOSIN78Z78Z24被复制4次,并且只保存第1行的第一个 我有这样一个例子: ALA1FZX 000130190402220180402sfossin78z78z241 ALA1FZX 000130190402220180402Sfosinsfossin78Z78Z215 ALA1FZX 000130190402220180402Sfosinsfossin78Z78Z225 ALA1FZX 000130190402220180402Sfosinsfossin78Z78Z235 ALA1FZX 000130190402220180402sfossin78z78z242 ALA1FZX 000130190402220180402sfossin78z78z244 ALA1FZX 000130190402220180402sfossin78z78z245 输出应为: ALA1FZX 000130190402220180402Sfosinsfossin78Z78Z241 ALA1FZX 000130190402220180402Sfosinsfossin78Z78Z215 ALA1FZX 000130190402220180402Sfosinsfossin78Z78Z225Shell Unix如何筛选文本文件以在部分行中查找1到49个字符的重复项并仅保存一个,shell,sorting,unix,duplicates,Shell,Sorting,Unix,Duplicates,我必须过滤多行数据,并在位置1-49字符处找到重复项。下一步,重复留在那里,否则重复项将被删除。 脚本必须在shell脚本中。我读过有关排序、uniq的文章,但找不到正确的例子 应从1到49个字符的重复行中删除并仅首先保存。 在示例行中:ALA1FZX 000130190402220180402SFOSIN78Z78Z24被复制4次,并且只保存第1行的第一个 我有这样一个例子: ALA1FZX 000130190402220180402sfossin78z78z241 ALA1FZX 00013
ALA1FZX 000130190402220180402sfossin78z78z235如果您不介意先对数据进行排序,可以使用
排序
和awk
的组合。从一组匹配行中,这将在对数据进行排序后打印第一行,该数据不一定是原始文件中的第一行
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
您可以采用两步流程,将ilne中的前49个字符拆分,并将其与原始行一起保存在文件中。然后可以使用
uniq
只保留uniq列。对于大量线路,速度可能较慢。你们有几行?