我在unix中有文件
a,b,c,d
e,f,g,h
u,v,x,y
我希望用它单独打印第一个col和其他所有col
即
a,b
a,c
a,d
e,f
e,g
e,h
等
提前致谢
答案 0 :(得分:5)
如果您希望将来面临此类问题,我建议您尝试开始GAWK: Effective AWK Programming by Arnold D. Robbins。
关于答案,在Awk
中非常简单!
awk 'BEGIN{FS=OFS=","}{for(i=2;i<=NF;i++) print $1,$i}' file
根据需要生成输出。
a,b
a,c
a,d
e,f
e,g
e,h
u,v
u,x
u,y
Awk
一次处理输入行一个。并且Awk
提供了一些特殊条款,BEGIN{}
和END{}
,其中包含要在处理文件之前和之后运行的操作。
因此,在文件处理发生之前设置了部分BEGIN{FS=OFS=","}
,FS
和OFS
是Awk
中的特殊变量,代表输入和输出字段分隔符。由于您提供的文件已被,
解除限制,因此您需要通过设置FS=","
来解析它,然后以.csv
格式将其打印回来,您需要设置OFS=","
}
命令的主要部分来自BEGIN
子句,它有一个for循环,循环到当前行中的最大字段数(这里NF
价值是4)。设置相应的去限制器后,您可以$1
,$2
.. $NF
访问各个字段。
我的循环从$2
开始,即从2 nd 去限制记录开始到最后一条记录,循环的动作部分是打印1 st 字段以及$i
表示的循环中遇到的任何字段。每个print
操作都会在换行符中打印值。因此,当您在循环中前进时,可以按预期打印字段。
答案 1 :(得分:1)
这可以通过这个perl one-liner
来完成perl -F, -anle '$first=shift@F;print"$first,$_"for@F' <input.txt
工作原理:
要了解开关,只需输入perl -h
-a
与-F,
结合使用:将,
分割为(默认变量)输入(自动分割的数组)@F
-n
:循环遍历-l
:行处理chomp行结束并在打印后添加换行符-e
:内联程序有关特殊变量和函数的信息,请参阅perldoc perlvar
和perldoc perlfun