Linux 如何打印第三列中的第三个字段

Linux 如何打印第三列中的第三个字段,linux,awk,Linux,Awk,在我的文件中,我有3个字段,我只想打印第三列中的第三个字段,但输出到第一行。请检查我的文件和输出: 显示文件内容 我使用以下命令仅在第三列中打印第三个字段 cat filename |awk '{print $3}' |tr ',' '\n' 在第一个字段位置输出打印第三个字段字符串,我希望仅在第三个字段区域打印 first field :- --------------- 1 2 3 4 5 5 预期产出 1st field 2nd field 3rd field ---

在我的文件中,我有3个字段,我只想打印第三列中的第三个字段,但输出到第一行。请检查我的文件和输出:

显示文件内容 我使用以下命令仅在第三列中打印第三个字段

cat filename |awk '{print $3}' |tr ',' '\n' 
在第一个字段位置输出打印第三个字段字符串,我希望仅在第三个字段区域打印

first field :-
---------------
1
2
3
4
5 
5
预期产出

1st field     2nd field    3rd field
---------     ---------    -----------
a,b,c,d       d,e,f,g,h     1
                            2
                            3
                            4
                            5 
                            5

q,w,e,r       t,y,g,t,i     9
                            8
                            7
                            6 
                            5
                            5
 [akshay@localhost tmp]$ cat file
 1st field     2nd field    3rd field
 ---------     ---------    -----------
 a,b,c,d       d,e,f,g,h    1,2,3,4,5,5

 q,w,e,r       t,y,g,t,i    9,8,7,6,5,5
 [akshay@localhost tmp]$ cat test.awk
    NR<3 || !NF{ print; next}
    { 
        split($0,D,/[^[:space:]]*/)
        c1=sprintf("%*s",length($1),"")
        c2=sprintf("%*s",length($2),"")
        split($3,A,/,/)
        for(i=1; i in A; i++)
        {   
            if(i==2)
            {
                $1 = c1
                $2 = c2
            }
            printf("%s%s%s%s%d\n",$1,D[2],$2,D[3],A[i]) 
        }
     }
 [akshay@localhost tmp]$ awk -f test.awk file
 1st field     2nd field    3rd field
 ---------     ---------    -----------
 a,b,c,d       d,e,f,g,h    1
                            2
                            3
                            4
                            5
                            5

 q,w,e,r       t,y,g,t,i    9
                            8
                            7
                            6
                            5
                            5
输入

1st field     2nd field    3rd field
---------     ---------    -----------
a,b,c,d       d,e,f,g,h     1
                            2
                            3
                            4
                            5 
                            5

q,w,e,r       t,y,g,t,i     9
                            8
                            7
                            6 
                            5
                            5
 [akshay@localhost tmp]$ cat file
 1st field     2nd field    3rd field
 ---------     ---------    -----------
 a,b,c,d       d,e,f,g,h    1,2,3,4,5,5

 q,w,e,r       t,y,g,t,i    9,8,7,6,5,5
 [akshay@localhost tmp]$ cat test.awk
    NR<3 || !NF{ print; next}
    { 
        split($0,D,/[^[:space:]]*/)
        c1=sprintf("%*s",length($1),"")
        c2=sprintf("%*s",length($2),"")
        split($3,A,/,/)
        for(i=1; i in A; i++)
        {   
            if(i==2)
            {
                $1 = c1
                $2 = c2
            }
            printf("%s%s%s%s%d\n",$1,D[2],$2,D[3],A[i]) 
        }
     }
 [akshay@localhost tmp]$ awk -f test.awk file
 1st field     2nd field    3rd field
 ---------     ---------    -----------
 a,b,c,d       d,e,f,g,h    1
                            2
                            3
                            4
                            5
                            5

 q,w,e,r       t,y,g,t,i    9
                            8
                            7
                            6
                            5
                            5
脚本

1st field     2nd field    3rd field
---------     ---------    -----------
a,b,c,d       d,e,f,g,h     1
                            2
                            3
                            4
                            5 
                            5

q,w,e,r       t,y,g,t,i     9
                            8
                            7
                            6 
                            5
                            5
 [akshay@localhost tmp]$ cat file
 1st field     2nd field    3rd field
 ---------     ---------    -----------
 a,b,c,d       d,e,f,g,h    1,2,3,4,5,5

 q,w,e,r       t,y,g,t,i    9,8,7,6,5,5
 [akshay@localhost tmp]$ cat test.awk
    NR<3 || !NF{ print; next}
    { 
        split($0,D,/[^[:space:]]*/)
        c1=sprintf("%*s",length($1),"")
        c2=sprintf("%*s",length($2),"")
        split($3,A,/,/)
        for(i=1; i in A; i++)
        {   
            if(i==2)
            {
                $1 = c1
                $2 = c2
            }
            printf("%s%s%s%s%d\n",$1,D[2],$2,D[3],A[i]) 
        }
     }
 [akshay@localhost tmp]$ awk -f test.awk file
 1st field     2nd field    3rd field
 ---------     ---------    -----------
 a,b,c,d       d,e,f,g,h    1
                            2
                            3
                            4
                            5
                            5

 q,w,e,r       t,y,g,t,i    9
                            8
                            7
                            6
                            5
                            5
解释

  • NR输入

    1st field     2nd field    3rd field
    ---------     ---------    -----------
    a,b,c,d       d,e,f,g,h     1
                                2
                                3
                                4
                                5 
                                5
    
    q,w,e,r       t,y,g,t,i     9
                                8
                                7
                                6 
                                5
                                5
    
     [akshay@localhost tmp]$ cat file
     1st field     2nd field    3rd field
     ---------     ---------    -----------
     a,b,c,d       d,e,f,g,h    1,2,3,4,5,5
    
     q,w,e,r       t,y,g,t,i    9,8,7,6,5,5
    
     [akshay@localhost tmp]$ cat test.awk
        NR<3 || !NF{ print; next}
        { 
            split($0,D,/[^[:space:]]*/)
            c1=sprintf("%*s",length($1),"")
            c2=sprintf("%*s",length($2),"")
            split($3,A,/,/)
            for(i=1; i in A; i++)
            {   
                if(i==2)
                {
                    $1 = c1
                    $2 = c2
                }
                printf("%s%s%s%s%d\n",$1,D[2],$2,D[3],A[i]) 
            }
         }
    
     [akshay@localhost tmp]$ awk -f test.awk file
     1st field     2nd field    3rd field
     ---------     ---------    -----------
     a,b,c,d       d,e,f,g,h    1
                                2
                                3
                                4
                                5
                                5
    
     q,w,e,r       t,y,g,t,i    9
                                8
                                7
                                6
                                5
                                5
    
    脚本

    1st field     2nd field    3rd field
    ---------     ---------    -----------
    a,b,c,d       d,e,f,g,h     1
                                2
                                3
                                4
                                5 
                                5
    
    q,w,e,r       t,y,g,t,i     9
                                8
                                7
                                6 
                                5
                                5
    
     [akshay@localhost tmp]$ cat file
     1st field     2nd field    3rd field
     ---------     ---------    -----------
     a,b,c,d       d,e,f,g,h    1,2,3,4,5,5
    
     q,w,e,r       t,y,g,t,i    9,8,7,6,5,5
    
     [akshay@localhost tmp]$ cat test.awk
        NR<3 || !NF{ print; next}
        { 
            split($0,D,/[^[:space:]]*/)
            c1=sprintf("%*s",length($1),"")
            c2=sprintf("%*s",length($2),"")
            split($3,A,/,/)
            for(i=1; i in A; i++)
            {   
                if(i==2)
                {
                    $1 = c1
                    $2 = c2
                }
                printf("%s%s%s%s%d\n",$1,D[2],$2,D[3],A[i]) 
            }
         }
    
     [akshay@localhost tmp]$ awk -f test.awk file
     1st field     2nd field    3rd field
     ---------     ---------    -----------
     a,b,c,d       d,e,f,g,h    1
                                2
                                3
                                4
                                5
                                5
    
     q,w,e,r       t,y,g,t,i    9
                                8
                                7
                                6
                                5
                                5
    
    解释


    • NR考虑到列是以制表符分隔的,我想说:

      awk 'BEGIN{FS=OFS="\t"}
           NR<=2 || !NF {print; next}
           NR>2{n=split($3,a,",")
                for (i=1;i<=n; i++)
                    print (i==1?$1 OFS $2:"" OFS ""), a[i]
               }' file
      
      awk'BEGIN{FS=OFS=“\t”}
      NR2{n=拆分($3,a,“,”)
      
      对于(i=1;i考虑到列是以制表符分隔的,我会说:

      awk 'BEGIN{FS=OFS="\t"}
           NR<=2 || !NF {print; next}
           NR>2{n=split($3,a,",")
                for (i=1;i<=n; i++)
                    print (i==1?$1 OFS $2:"" OFS ""), a[i]
               }' file
      
      awk'BEGIN{FS=OFS=“\t”}
      NR2{n=拆分($3,a,“,”)
      对于(i=1;i
      $cat tst.awk
      NR<代码>$cat tst.awk
      


      n像
      1st field
      这样的字段名是否在文件中,或者您只是为了更好地理解而包含?添加是为了更好地理解字段的宽度总是相同的?没有一些行在意义上有更多的值不一样..像
      1st field
      这样的字段名是否在文件中,或者您只是为了更好地理解而包含?添加了为了更好地理解字段的宽度是否总是相同的?不,某些行的值在某种意义上是不同的..是否有否决的理由?如果有什么不对劲,我将非常感谢您的评论抱歉,输出不符合预期,混合所有字段,请您提供更好的解决方案,我没有否决vote@DasD这是tab sepa额定值,没有什么可以做的。你可以通过管道清除它,但这是你应该做的事情;这里我只是展示应用的逻辑,这是重要的部分。第一个字段第二个字段第三个字段---------------输出仅获取此标题,请在命令发出后检查se@DasD通读答案。在顶部我说“考虑到列是以制表符分隔的”.投票失败的原因是什么?如果有什么不对劲的话,我希望你能给我一个评论。对不起,输出没有达到预期,混合了所有字段,你能提供更好的解决方案吗?我没有失败vote@DasD它是分开的,没有什么可以做的。你也许可以通过管道来清除它,但这是你应该做的事情oing;这里我只是展示要应用的逻辑,这是重要的部分。第一个字段第二个字段第三个字段---------------输出仅获取此标题,请检查一下命令please@DasD通读答案。在顶部我说“考虑到列是以制表符分隔的”.Super Akshay,您提供的脚本是我的原样。非常感谢,并请您解释一下脚本。我必须更改我原始文件nice one@AkshayHegdeTo中的一些修改,以创建长度为
      的字符串($1)
      空格您不需要像调用
      c1=sprintf(sprintf(%%%ds)那样调用sprintf两次,length($1)),“”
      因为只要
      c1=sprintf(%%*s),length($1),“”
      就可以了。调用
      split($3,A,/,/)
      每次循环都是非常低效的。Super Akshay,您提供的脚本是按原样输出的。非常感谢并请您解释脚本,我必须更改原始文件nice one@AkshayHegdeTo中的一些修改,以创建长度为
      的字符串($1)
      blanks您不需要像在
      c1=sprintf(sprintf(%%%ds,length($1)),“”)中那样调用两次sprintf,因为只要
      c1=sprintf(%%*s,length($1),“”)就可以了。
      每次通过循环调用
      split($3,A,/,/)
      效率非常低。注意,您可以从
      n=split()
      然后从1循环到ncorrect,但如果不需要的话,我通常不会引入另一个全局变量。但它不会影响顺序吗?不,在那种情况下,
      中的
      I只是测试数组中是否存在索引。它周围的
      I=1
      I++
      控制数组的遍历顺序当你为(a中的i)编写
      而不是为(a中的i=1;i++)编写
      时,
      中的
      操作符本身控制数组的遍历顺序。@Ed Morton:正如我一直说的,你是最好的,喜欢从你的图例中学习。注意,你可以从
      n=split()中获得字段的数量
      然后从1循环到ncorrect,但如果不需要的话,我通常不会引入另一个全局变量。但它不会影响顺序吗?不,在那种情况下,
      中的
      I只是测试数组中是否存在索引。它周围的
      I=1
      I++
      控制数组的遍历顺序当你为(a中的i)编写
      而不是为(a中的i=1;i++)编写
      时,
      中的
      操作符本身控制数组的遍历顺序。@Ed Morton:正如我一直说的,你是最好的,我喜欢向你学习。