Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在csv文件中输出第一个副本_Bash_Sorting_Csv_Awk_Duplicates - Fatal编程技术网

Bash 在csv文件中输出第一个副本

Bash 在csv文件中输出第一个副本,bash,sorting,csv,awk,duplicates,Bash,Sorting,Csv,Awk,Duplicates,如何输出csv文件的第一个副本? 例如,如果我有: 00:0D:67:24:D7:25,1,-34,123,135 00:0D:67:24:D7:25,1,-84,567,654 00:0D:67:24:D7:26,1,-83,456,234 00:0D:67:24:D7:26,1,-86,123,124 00:0D:67:24:D7:2C,1,-56,245,134 00:0D:67:24:D7:2C,1,-83,442,123 00:18:E7:EB:BC:A9,5,

如何输出csv文件的第一个副本? 例如,如果我有:

00:0D:67:24:D7:25,1,-34,123,135  
00:0D:67:24:D7:25,1,-84,567,654  
00:0D:67:24:D7:26,1,-83,456,234  
00:0D:67:24:D7:26,1,-86,123,124  
00:0D:67:24:D7:2C,1,-56,245,134  
00:0D:67:24:D7:2C,1,-83,442,123  
00:18:E7:EB:BC:A9,5,-70,123,136  
00:18:E7:EB:BC:A9,5,-90,986,545  
00:22:A4:25:A8:F9,6,-81,124,234  
00:22:A4:25:A8:F9,6,-90,456,654  
64:0F:28:D9:6E:F9,1,-67,789,766  
64:0F:28:D9:6E:F9,1,-85,765,123  
74:9D:DC:CB:73:89,10,-70,253,777
我希望我的输出如下所示:

00:0D:67:24:D7:25,1,-34,123,135  
00:0D:67:24:D7:26,1,-83,456,234  
00:0D:67:24:D7:2C,1,-56,245,134  
00:18:E7:EB:BC:A9,5,-70,123,136  
00:22:A4:25:A8:F9,6,-81,124,234  
64:0F:28:D9:6E:F9,1,-67,789,766  
74:9D:DC:CB:73:89,10,-70,253,777
prev_field=""
while read line
do
  current_field=$(echo $line | cut -d ',' -f 1)
  [[ $current_field != $prev_field ]] && echo $line
  prev_field=$current_field
done < "stuff.csv"
我想先输出csv文件的第一行,比如
awk(输出第一行的代码)>>file.csv
,然后比较该行的第一个字段和下一行的第一个字段,如果它们相同,检查下一行。在到达新行之前,代码将输出新的不同行,因此再次
awk(输出的代码)>>file.csv
,并将重复该操作,直到检查完成


我对bash编码有点陌生,但到目前为止我很喜欢它,我目前正在编写一个csv文件,我需要一些帮助。谢谢大家

如果我理解你的意思,你想要这样的东西:

00:0D:67:24:D7:25,1,-34,123,135  
00:0D:67:24:D7:26,1,-83,456,234  
00:0D:67:24:D7:2C,1,-56,245,134  
00:18:E7:EB:BC:A9,5,-70,123,136  
00:22:A4:25:A8:F9,6,-81,124,234  
64:0F:28:D9:6E:F9,1,-67,789,766  
74:9D:DC:CB:73:89,10,-70,253,777
prev_field=""
while read line
do
  current_field=$(echo $line | cut -d ',' -f 1)
  [[ $current_field != $prev_field ]] && echo $line
  prev_field=$current_field
done < "stuff.csv"
prev_field=“”
读行时
做
当前_字段=$(回显$行|切-d','-f 1)
[[$current\u field!=$prev\u field]&&echo$line
上一个字段=$当前字段
完成<“stuff.csv”
其中
stuff.csv
是您的文件名。这是假设您要做的是获取csv行中的第一个字段,只打印它的第一个唯一匹配项,如果是这种情况,我认为您的输出可能会丢失一些。

使用awk:

awk -F, '!a[$1]++' file.csv
awk形成一个数组,其中第一列是键,值是特定键出现的次数。”<代码>!只有当第一列第一次出现时,[$1]+”才为真,因此打印第一行

perl -F, -lane '$x{$F[0]}++;print if($x{$F[0]}==1)' your_file
如果要在原地更改文件,请执行以下操作:

perl -i -F, -lane '$x{$F[0]}++;print if($x{$F[0]}==1)' your_file
使用uniq:

sort lines.csv | uniq -w 17

如果您的第一列是固定大小的(17)。lines.csv是一个包含原始输入的文件。

哦,是的,我遗漏了一些,但这正是我需要的,我如何输出这个新编译的列表?我想我不能把>newStuff.csv放在世界的任何地方code@user2143205您只需运行脚本并将输出重定向到一个文件,如so
bash script.sh>newStuff.csv
。我倾向于这样做,因为它在数据结束的地方更灵活。换句话说,你可以在输出上执行类似于
bash script.sh | grep“something”
和grep的操作。没关系,我在
完成后粘贴了
>newStuff.csv
,它成功了。谢谢