使用awk处理文件的输出

时间:2017-06-02 08:46:28

标签: shell unix awk

我在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

提前致谢

2 个答案:

答案 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=","}FSOFSAwk中的特殊变量,代表输入和输出字段分隔符。由于您提供的文件已被,解除限制,因此您需要通过设置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 perlvarperldoc perlfun

  • shift:删除数组前面的元素