Bash - 比较行然后只打印原始行

时间:2017-07-15 19:29:23

标签: bash shell awk

我的文件看起来像这样,(可以有更多列或行):

dif-1-2-3-4.com 1 1 1
dif-1-2-3-5.com 1 1 2
dif-1-2-4-5.com 1 2 1
dif-1-3-4-5.com 2 1 1
dif-2-3-4-5.com 1 1 1

我想比较这些数字:

1 1 1
1 1 2
1 2 1
2 1 1
1 1 1

并且只打印那些不重复的行,所以我明白了:

dif-1-2-3-4.com 1 1 1
dif-1-2-3-5.com 1 1 2
dif-1-2-4-5.com 1 2 1
dif-1-3-4-5.com 2 1 1

4 个答案:

答案 0 :(得分:4)

另一个简单方法是myBezierPath.cgPath.isClosed() sort使用KEYDEF进行字段2-4 uniq并使用sort跳过字段1,例如

uniq

示例使用/输出

$ sort file.txt -k 2,4 | uniq -f1

答案 1 :(得分:2)

保持已经看到的三元组的运行记录,并且仅在它们第一次出现时打印:

$ awk '!(($2,$3,$4) in seen) {print; seen[$2,$3,$4]}' file
dif-1-2-3-4.com 1 1 1
dif-1-2-3-5.com 1 1 2
dif-1-2-4-5.com 1 2 1
dif-1-3-4-5.com 2 1 1

答案 2 :(得分:2)

尝试使用以下<h1>JavaScript Progress Bar</h1> <div id="myProgress"> <div id="myBar">0%</div> <input type="hidden" id="bar" name="bar" value="60" /> </div> <div id="myProgress_1"> <div id="myBar_1">0%</div> <input type="hidden" id="bar_1" name="bar" value="60" /> </div> <br> <button>Click Me</button>代码:

awk

<强> 说明: 创建名为awk '!a[$2,$3,$4]++' Input_file 的数组及其索引为a。这里的条件$2,$3,$4,(这意味着数组!a中不存在任何行$2,$3,$4),然后做两件事:< / p>

  1. 将特定索引的值增加到 1 ,以便下次该条件对于数组a中的相同$2,$3,$4索引不成立。
  2. 未指定操作(因此a条件模式下工作,然后操作),因此默认操作将是打印当前线。这将继续显示 Input_file 中的所有行,并且不会打印最后一行,因为其awk已存在于数组$2,$3,$4中。
  3. 我希望这会有所帮助。

答案 3 :(得分:1)

这适用于POSIX和gnu awk:

$ awk '{s=""
        for (i=2;i<=NF; i++) 
               s=s $i "|"} 
       s in seen { next }
       ++seen[s]' file

可以缩短为:

$ awk '{s=""; for (i=2;i<=NF; i++) s=s $i "|"} !seen[s]++' file

还支持可变数量的列。

如果你想要一个同样尊重文件顺序的sort uniq解决方案(即打印重复的第一组,而不是后面的那些),你需要做一个装饰,排序,去装饰方法

你可以:

  1. 使用cat -n使用行号装饰文件;
  2. sort -k3 -k1n首先对从3行开始的所有字段进行排序,然后在行的末尾以数字方式对添加的行号进行排序;
  3. 如果您的-u版本支持该版本,请
  4. 添加sort,或使用uniq -f3仅保留重复组中的第一个版本;
  5. 最后使用sed -e 's/^[[:space:]]*[0-9]*[[:space:]]*//删除添加的行号:

    cat -n file | sort -k3 -k1n | uniq -f3 | sed -e 's/^[[:space:]]*[0-9]*[[:space:]]*//'

  6. 在这种情况下,Awk更容易,更快。