使用AWK处理siml-csv文件

时间:2011-06-24 16:41:46

标签: linux bash csv awk

我有一个这样的文件:

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

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

任何提示?

3 个答案:

答案 0 :(得分:0)

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

以下内容应该按照您的要求进行。将字段分隔符设置为“-F\"(转义为”with)并打印第二个字段,第一个字段位于“或”的左侧。您可以只放一个管道和行的末尾来做什么你想要的。

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

  

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

FS是Field Seperator

答案 1 :(得分:0)

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

这涉及包含简单的双引号字段的行,删除任何额外的材料。它会通过任何不匹配的行。

如果要删除不匹配的行,则:

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

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

如果您必须处理数据字段,例如:

"He said, ""It's horrid""" and he meant it!
那么你必须更加努力地工作。如果sed支持扩展正则表达式或PCRE(Perl兼容正则表达式),则可以执行此操作。如果没有,请改用awk

答案 2 :(得分:0)

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

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

cut -d\" -f1-2 input

使用纯bash的解决方案,请参阅5.1 Bourne Shell Variables了解IFS

的说明
#!/bin/bash

IFS='"'

while read -ra LINE;
do
    echo ${LINE[1]}
done < input

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

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

最后一个在perl中。 -a打开autosplit模式 - perl会自动将空白上的输入行拆分为@F数组。 -F与-a一起使用,以选择分割线的分隔符。

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