在我的文件中,我有3个字段,我只想打印第三列中的第三个字段,但输出将进入第一行。请检查我的文件并输出:
显示文件内容

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

我使用以下命令只打印第三列中的第三个字段
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

解释
NR<3 || !NF{ print; next}
nr提供正在处理的记录总数或行号,简而言之nr变量有行号。
nf提供记录中字段的总数。
下一条语句强制awk立即停止处理
当前记录并继续下一个记录。
如果行号小于3或不等于nf(表示记录中没有空行字段),则打印当前记录并转到下一条记录。
split($0,D,/[^[:space:]]*/)
因为我们有兴趣保留格式,所以我们在这里保存数组D字段之间的分隔符,如果您有gnu awk,可以使用第四个参数来split()-它允许您将行拆分为两个数组,一个字段和另一个字段之间的分隔符,然后您可以对字段数组进行操作,并使用每个字段数组元素之间的分隔符数组打印,以重建原始的$0
c1=sprintf("%*s",length($1),"")c2=sprintf("%*s",length($2),"")
这里sprintf函数用于填充字段($1 or $2长度)的空格字符。
split($3,A,/,/)
拆分(字符串,数组[,fieldsep[,seps]])
将字符串分割成由fieldsep分隔的片段并存储这些片段
以及seps数组中的分隔字符串。第一件
存储在数组[1]中,第二块存储在数组[2]中,以此类推。这个
第三个参数fieldsep的字符串值是描述
在何处拆分字符串(正如fs可以是一个regexp来描述
分割输入记录)。如果省略fieldsep,则使用fs的值。
split()返回创建的元素数。
循环直到i in A是真的,我才知道i=1i++控制数组的遍历顺序,这多亏了ed morton
if(i==2){ $1 = c1 $2 = c2}
当我们打印i = 1a,b,c,d时,在下一次迭代中,我们使用上面创建的d,e,f,g,h$1修改$2c1值,因为您只想按要求显示一次。
c2
最后打印field1(printf("%s%s%s%s%d\n",$1,D[2],$2,D[3],A[i]))、field1和field2之间的分隔符(即$1)、field2(D[2])、field2和field3之间的分隔符以及array$2元素(仅由我们从(A创建)。

关于linux - 如何在第三栏本身中打印第三栏,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30613893/

10-13 08:05