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