【问题标题】:manipulate output from file using awk [closed]使用 awk 操作文件的输出 [关闭]
【发布时间】:2017-06-02 08:46:27
【问题描述】:

我有unix文件

a,b,c,d
e,f,g,h
u,v,x,y

我想单独打印第一列和其他列

a,b
a,c
a,d
e,f
e,g
e,h

等等

提前致谢

【问题讨论】:

  • 你自己尝试了什么? 为什么在e,g 记录之后有一个,
  • @AbBennett 是的,据了解,您之所以提出这个问题是因为您遇到了这个问题......但是 SO 是关于获得您已经尝试过的代码的帮助,而不是询问整个代码...... .
  • @AbBennett:很高兴您找到了问题的答案,但请注意 StackOverflow 中的这种态度!人们通常会先查看一个人提出的问题的历史,然后再检查他们提出问题的努力。如果重复相同类型的行为,即提出类似性质的问题而没有表现出努力,您的帖子可能会被否决并且不会吸引太多答案。 “我的 2 美分”
  • @AbBennett 你至少可以放一个你试过的 awk 命令...its a one line command 那你为什么不做呢?需要大量学习才能找到解决方案...i just needed a quick answer 然后在其他地方询问...所以不是正确的论坛
  • 如果您将其放在您的问题中而不是作为评论并删除您的just shut up and give me my answer cmets,那么它将停止您将获得的大量反对票。

标签: shell unix awk


【解决方案1】:

如果您希望将来遇到此类问题,我建议您尝试开始使用 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 循环,循环到 current 行中的最大字段数(这里NF 的值为 4) .设置适当的分隔符后,您可以通过 $1,$2..$NF 访问各个字段。

我的循环从$2 开始,即从 2nd 分隔记录开始到最后一条记录,循环的动作部分是打印 1st 字段和循环中遇到的任何字段,由$i 表示。每个print 操作都会在换行符中打印值。因此,随着循环的进行,您可以按预期打印字段。

【讨论】:

    【解决方案2】:

    这可以用这个 perl 单行来完成

    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 : 移除数组前面的元素

    【讨论】:

    • 谢谢,完美回答
    猜你喜欢
    • 2015-05-06
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-15
    相关资源
    最近更新 更多