我在下面的命令中根据第二列提取重复的行(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",...
答案 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操作系统)下运行可移植脚本,最简单的方法是在脚本的开头添加一行:
如果您的脚本使用ksh
或bash
:
export PATH="$(getconf PATH):$PATH"
如果您的脚本使用旧版/bin/sh
:
PATH="`getconf PATH`:$PATH"; export PATH
要使交互式shell以兼容模式运行,您还可以将其中一行添加到正确的初始化文件(.profile
,.bash_profile
,...)
这应该可以解决你的命令所遭受的问题。