创建具有文件重复的新文件

时间:2016-07-08 21:30:10

标签: csv awk grep solaris

我在下面的命令中根据第二列提取重复的行(file.csv以逗号分隔):

awk -F',' '{print $2}' file.csv | sort | uniq -d | grep -F -f - file.csv >file.bad

但是在Solaris上,由于不支持-F命令的grep参数,因此该命令不起作用。

原始文件中的行示例:

"A","TEST","Other","TEST",...  
"A","TEST2","Other A","TEST2",...  
"A","TEST","Other B","TEST",...

新文件中的行示例:

"A","TEST","Other","TEST",...  
"A","TEST","Other B","TEST",...

3 个答案:

答案 0 :(得分:2)

cat sample.csv

"A","TEST","Other","TEST",...
"A","TEST2","Other A","TEST2",...
"A","TEST","Other B","TEST",...

运行如下:

awk -F, 'NR==FNR{a[$2]++;next} (a[$2]>1)' sample.csv sample.csv > new_file.csv

new_file.csv的内容

"A","TEST","Other","TEST",...
"A","TEST","Other B","TEST",...

我做的是读取样品2次。第一次在数组中存储第二个字段,然后第二次检查第二个字段的发生时间是否多于一次,我们打印出该行。

  • NR == FNR {A [$ 2] ++;}下一个 将第二个字段存储在数组a中,然后转到下一个记录/行

  • (a [$ 2]> 1)当第二次读取sample.csv文件时,检查数组是否多次出现第二个字段,如果第二个字段有重复,则打印出该行

答案 1 :(得分:1)

在您的管道中明确使用/usr/xpg4/bin/grep而不是普通grep(可能从/usr/bin/grep中选择它。)

Solaris上的/usr/bin/grep不支持-F选项(也不支持-f选项来读取文件中的模式),但根据{{/usr/xpg4/bin/grep /usr/xpg4/bin。 3}}。您甚至可能希望将$PATH放在-f的前面,以避免将来出现此问题。我不是Solaris用户,所以我不知道这是否合理。

此外,/usr/xpg4/bin/grep的{​​{1}}标志采用文件名。我不确定它是否将-理解为标准输入。

要强制从标准输入读取,请将-替换为/dev/stdin

您的管道现在看起来像这样:

awk -F',' '{print $2}' file.csv | sort | uniq -d | /usr/xpg4/bin/grep -F -f /dev/stdin file.csv >file.bad

答案 2 :(得分:0)

您正在使用Solaris默认PATH,其中某些已执行的命令最终成为旧版命令,而不是符合POSIX标准的命令。要在Solaris(以及其他类似Unix操作系统)下运行可移植脚本,最简单的方法是在脚本的开头添加一行:

如果您的脚本使用kshbash

export PATH="$(getconf PATH):$PATH"

如果您的脚本使用旧版/bin/sh

PATH="`getconf PATH`:$PATH"; export PATH

要使交互式shell以兼容模式运行,您还可以将其中一行添加到正确的初始化文件(.profile.bash_profile,...)

这应该可以解决你的命令所遭受的问题。