在我的文件中,我有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=1
和i++
控制数组的遍历顺序,这多亏了ed mortonif(i==2){ $1 = c1 $2 = c2}
当我们打印
i = 1
和a,b,c,d
时,在下一次迭代中,我们使用上面创建的d,e,f,g,h
和$1
修改$2
和c1
值,因为您只想按要求显示一次。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/