我有一个文件,其中的行包含一些由“|”分隔的字段。
我必须根据某些文件提取相同的行 (即找到包含字段1,2,3,12和13的相同值的行) 其他字段内容对搜索没有重要意义,但整个提取的行必须完整。
任何人都可以告诉我如何在KSH脚本中做到这一点 (通过一个带有一些参数(依赖于顺序)的脚本来定义fileds分隔符和必须进行比较的字段以查找输入文件中的重复行)
提前致谢并致以亲切的问候
奥利
答案 0 :(得分: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 :(得分:-1)
这会打印重复的行 - 每行只有一行:
awk -F'|' '!arr[$1$2$3$12$13]++' inputfile > outputfile