【问题标题】:awk + how to read CSV file with quotation markawk + ​​如何读取带引号的 CSV 文件
【发布时间】:2014-08-27 01:16:37
【问题描述】:

我在 CSV 文件中有以下行

   1,LINUX,"/usr/cti/conf/apps/parameters  param1 param2","root passowrd" 

在我删除分隔符“,”后,sed

我现在想从该行读取每个字段

#  echo 1  LINUX "/usr/cti/conf/apps/parameters  param1 param2" "root passowrd"  | awk '{print $1}'
1

#  echo 1  LINUX "/usr/cti/conf/apps/parameters  param1 param2" "root passowrd"  | awk '{print $2}'
LINUX

#  echo 1  LINUX "/usr/cti/conf/apps/parameters  param1 param2" "root passowrd"  | awk '{print $3}'
/usr/cti/conf/apps/parameters

第三个字段的预期结果应该是 "/usr/cti/conf/apps/parameters param1 param2"

请告知如何阅读该字段以获取引号之间的所有单词,

需要在我的 awk 命令中添加什么?

所以如果是单个单词,那么 awk 应该只打印这个单词 如果 awk 看到引号之间的单词,那么 awk 应该打印引号之间的所有单词

  • 备注 CSV 中的每个字段可以带引号或不带引号, 例如,第一个字段可以包含 3 个单词,例如“一二三”,或者第一个字段可能只有一个单词,awk 应该支持这两种情况

【问题讨论】:

  • 您想获取", 之间的值吗?
  • 我猜你的echos 错过了逗号分隔字段。如果是这样,cut -d',' -f3 会成功,因为它将根据逗号分隔符提取第三个字段。
  • @fedorqui 他通过 sed 删除了逗号。如果他不这样做,那么提取数据会很容易。我还是不明白他的意思。
  • 好的,我同意你的观点,我不会从行中删除逗号,所以这种情况下的解决方案会很简单吗?使用 cut -d ',' -fx
  • 或者使用 , 作为 awk 中的字段分隔符。

标签: linux bash awk sed ksh


【解决方案1】:

不要使用 sed 删除逗号:您将丢失 CSV(逗号分隔值)中的“c”,事情变得更加复杂。如果是这样,您可以像这样使用cut

cut -d',' -f3

例子:

$ cut -d',' -f3 <<< '1,LINUX,"/usr/cti/conf/apps/parameters  param1 param2","root passowrd"'
"/usr/cti/conf/apps/parameters  param1 param2"

$ cut -d',' -f3 <<< '1,LINUX,/usr/cti/conf/apps/parameters  param1 param2,"root passowrd"'
/usr/cti/conf/apps/parameters  param1 param2

它适用于字段以逗号分隔的任何情况。因此,您不必担心双引号包裹字段的情况。

【讨论】:

    【解决方案2】:

    在下面的 awk 命令中,字段分隔符设置为 ",以便我们可以通过打印列号 2 轻松获取字符串 /usr/cti/conf/apps/parameters param1 param2。要包含双引号,只需在触发打印时添加 FS 变量命令。

    $ echo '1  LINUX "/usr/cti/conf/apps/parameters  param1 param2" "root passowrd"'  | awk -F'"' '{print FS$2FS}'
    "/usr/cti/conf/apps/parameters  param1 param2"
    

    如果您不想在最终结果中打印",请尝试以下操作,

    $ echo '1  LINUX "/usr/cti/conf/apps/parameters  param1 param2" "root passowrd"'  | awk -F'"' '{print $2}'
    /usr/cti/conf/apps/parameters  param1 param2
    

    如果您的输入是这样的1,LINUX,"/usr/cti/conf/apps/parameters param1 param2","root passowrd",那么您可以使用, 作为字段分隔符来获取字符串"/usr/cti/conf/apps/parameters param1 param2"

    $ echo '1,LINUX,"/usr/cti/conf/apps/parameters  param1 param2","root passowrd"' | awk -F, '{print $3}' 
    "/usr/cti/conf/apps/parameters  param1 param2"
    

    【讨论】:

    • 当您知道“存在,但万一我们没有”时,您的解决方案很好,那么您的 awk 不支持此功能(因此需要支持两者的 awk - 何时存在以及何时不存在存在)
    • 我不明白你的意思。
    • 双引号是关键。没有它,我们将如何发布答案。
    • 我的意思是第二个字段可以只有一个字符串,并且可以有多个带引号的字符串,你有解决方案吗?
    • @maihabunash 您最好更新您的问题,提供更多示例输入以及更通用的解释。在这些 cmets 中,理解您的意思是相当复杂的。
    猜你喜欢
    • 2020-09-07
    • 2021-04-12
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2017-06-24
    • 1970-01-01
    相关资源
    最近更新 更多