2

如何输出 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

我在考虑首先输出 csv 文件的第一行,awk (code that outputs first row) >> file.csv然后将行的第一个字段与下一行的第一个字段进行比较,如果它们相同,请检查下一行。直到出现新行,代码将再次输出新的不同行,awk (code that outputs) >> file.csv并且将重复直到检查完成

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

4

4 回答 4

5

使用 awk:

awk -F, '!a[$1]++' file.csv

awk 形成一个数组,其中第一列是键,值是 no 的计数。特定键出现的次数。' !a[$1]++' 仅在第一列第一次出现时才为真,因此该行的第一次出现被打印。

于 2013-03-08T02:38:46.723 回答
1

如果我明白你在做什么,你想要这样的东西:

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"

stuff.csv你的文件名在哪里。那是假设您要做的是获取 csv 行中的第一个字段,并且只打印它的第一个唯一出现,如果是这种情况,我认为您的输出可能会丢失一些。

于 2013-03-08T02:11:30.027 回答
1

使用 uniq:

sort lines.csv | uniq -w 17

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

于 2013-04-23T14:59:22.770 回答
0
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
于 2013-03-08T06:19:55.827 回答