【问题标题】:Process a siml-csv file with AWK使用 AWK 处理 siml-csv 文件
【发布时间】:2011-06-24 16:41:45
【问题描述】:

我有一个这样的文件:

 "text I don't know" command other "text" 
 "some" different text "type"

我需要使用 sed、awk 或任何 bash 工具获取“我不知道的文本”和“一些”,以通过管道传输到另一个命令。

有什么提示吗?

【问题讨论】:

  • 从你的文件中举一个例子,一个小例子。还有,这是作业吗?

标签: linux bash csv awk


【解决方案1】:

这似乎过于简单,这意味着您可能是 awk 的新手。这是完全可以接受的,或者我误解了你的问题。我希望是前者。

以下内容应满足您的要求。将字段分隔符设置为“-F\"”(用“转义”)并打印第二个字段,第一个字段在“”的左侧,或者什么都没有。你可以只放一个管道和行尾来做你想做的事.

awk -F\" '{print FS$2FS}' inputFile.txt

“我不知道的文字”
“一些”

FS 是字段分隔符

【讨论】:

  • 所有答案都很好,但这是“最干净的” :) 谢谢!
  • 顺便说一句,我完全不知道 awk :-P
  • 哦,不,您必须注意awk =P,它确实非常有用,尤其是对于基本的文本操作。我强烈建议您花几分钟时间阅读它的功能,其中很多内容更容易学习。
【解决方案2】:
sed 's/^\("[^"]*"\).*/\1/'

这处理包含简单双引号字段的行删除任何额外的材料。它通过任何不匹配不变的行。

如果你想删除不匹配的行,那么:

sed -n '/^\("[^"]*"\).*/s//\1/p'

默认情况下不打印,并在找到匹配项时打印。

如果必须处理数据字段如:

"He said, ""It's horrid""" and he meant it!

那么你必须更加努力地工作。如果您的sed 支持扩展正则表达式或 PCRE(Perl 兼容正则表达式),您可以这样做。如果没有,请改用awk

【讨论】:

    【解决方案3】:

    不确定" 是否应该是输出的一部分,假设不是。如果我弄错了,将它添加到输出中应该没有任何问题(故意将sed 排除在下面的列表之外,因为@Jonathan-Leffler 的答案非常好)

    由于"作为第一个字符输出,这不是一个完美的解决方案,但它很简单。

    cut -d\" -f1-2 input
    

    使用纯bash的解决方案,IFS的解释见5.1 Bourne Shell Variables

    #!/bin/bash
    
    IFS='"'
    
    while read -ra LINE;
    do
        echo ${LINE[1]}
    done < input
    

    使用 awk 和 -F 标志将分隔符更改为 " 的解决方案

    $ awk -F\" '{print $2}' input
    

    最后是 perl 中的一个。 -a 开启自动拆分模式——perl 会自动将空格上的输入行拆分到 @F 数组中。 -F 与 -a 结合使用,用于选择分割行的分隔符。

    perl -F\" -lane 'print $F[1]' input
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 2020-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      相关资源
      最近更新 更多