2010-05-26 17 views
2

我有一个文件,其中有一些行由“|”分隔的行。根据行上的一些分隔文件找到重复行

我要提取基于一些的Fileds的 是相同的线(即发现其包含字段1,2,3 12相同的值的行,和13) 其它字段内容具有用于搜索没有重要性但是整个提取的行必须完整。

谁能告诉我怎么在KSH脚本中做到这一点 (通过一些脚本来定义文件的分隔符和必须进行比较以在输入文件中查找重复行的字段)

在此先感谢和亲切的问候

奥利

+0

它可以帮助您显示目前为止的脚本以及一些示例数据。另外,是否要丢弃(不打印)没有重复项的行并打印所有重复的行?或者是否仅打印符合一组标准的行? – 2010-05-26 13:08:38

回答

2

这版画复制基于匹配字段行。它使用一个关联数组,它可以根据输入文件的性质变大。输出没有排序,因此大多数副本没有组合在一起(除了一组的前两个)。

awk -F'|' '{ idx=$1$2$3$12$13; if (array[idx] == 1) {print} else if (array[idx]) {print array[idx]; print; array[idx]=1} else {array[idx]=$0}}' inputfile.txt 

你也许可以建立你的索引列表中shell变量在一个包装脚本是这样的:

#!/bin/ksh 
for arg 
do 
    case arg in # validate input (could be better) 
     +([0-9])) # integers only 
      idx="$idx'$'$arg" 
      ;; 
     *) 
      echo "Invalid field specifier" 
      exit 
      ;; 
    esac 
done 
awk -F'|' '{ idx='$idx'; if (array ... 

您可以通过一个命令管道是像这样的输出进行排序:

awk ... | sort --field-separator='|' --key=1,1 --key=2,2 --key=3,3 --key=12,12 --key=13,13 
-1

打印其被复制线 - 每个只有一行:

awk -F'|' '!arr[$1$2$3$12$13]++' inputfile > outputfile 
+0

这是不同的SO问题/答案的变体:[Grep只是其中一个部分重复](http://stackoverflow.com/questions/21929071/grep-only-one-of-partial-duplicates)。它的行为的确是清除重复的东西,但这意味着在这种情况下:将任何重复的原始文件都留下; *还*留下任何没有重复的行。所以输出文件将包含很多误报。 – 2014-10-22 08:29:28

相关问题