【问题标题】:AWK - removal of the same fields on the basis of the "$1"AWK - 根据“$1”删除相同的字段
【发布时间】:2012-10-31 02:27:22
【问题描述】:

我有一个文件1:

6 
3 
6 
9 
2 
6

此命令打印结果:

awk 'NR==1{a=$1};$0!=a' file1
3 
9 
2

现在我有了文件 2:

6 1 2 3 4 5 
3 3 4 4 4 6 
6 5 2 2 5 1 
9 1 3 5 4 1 
2 5 6 4 8 5 
6 1 5 2 3 1

我想做同样的事情,但使用 file2。我想打印出结果:

3 3 4 4 5 6 
9 5 3 2 8 1 
2 5 6 5 3 1 
    5 4   1 
      2

我想在 awk 中完成。感谢您的帮助。

【问题讨论】:

    标签: awk


    【解决方案1】:

    AWK 并不真正适合您尝试做的事情,因为它是为一次处理一行而设计的,而您试图在不同行之间上下移动数字。也就是说,这个怪物应该为所欲为:

    awk 'NR==1{nc=NF;for(i=1;i<=nc;i++)a[i]=$i}{for(i=1;i<=nc;i++){if($i!=a[i]){v[m[i]++,i]=$i;if(m[i]>nl)nl=m[i]}}}END{for(l=0;l<nl;l++){for(i=1;i<=nc;i++){if(l<m[i]){printf("%d ", v[l,i])}else{printf("  ")}}printf("\n")}}'
    

    另一方面,如果您的数字矩阵已被转置,则此任务会简单得多:

    awk '{for(i=2;i<=NF;i++)if($i!=$1)printf(" %d",$i);printf("\n")}'
    

    【讨论】:

    • 感谢您的帮助。第一个例子几乎是好的。仅在字段 $1 之前打印不必要的空格并在文件末尾打印一个空行。第二个例子不起作用。
    • @Tedee12345 - 我现在已经更新了第一行。如果您阅读了我写的内容,您会发现第二行不适用于您的情况,如果您交换文件中的行和列(即转置它),它会起作用。
    • 现在第一个例子有效。至于我,这有点复杂。谢谢。
    • 如果您不再寻找答案,请记住通过接受来结束问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2010-09-29
    • 2016-02-21
    相关资源
    最近更新 更多