【问题标题】:Adding double quotes to two fields in unix在unix中为两个字段添加双引号
【发布时间】:2012-01-24 15:24:13
【问题描述】:

我有一个包含 3 列的文件,第二列是纬度/经度,可能有数据,也可能没有数据。

2012-01-10 21:27:52.811,,ABC   -- No lat/long
2012-01-10 21:27:52.811,37.8889329,-112.1876328,XYZ  -- with lat long

有人可以帮助我使用 sed/awk/perl 将其转换为

2012-01-10 21:27:52.811,"37.8889329,-112.1876328",XYZ

在所有其他情况下,它不应添加任何双引号

提前致谢

【问题讨论】:

  • 为什么一定要单线?你在哪个部分苦苦挣扎?还有多少列?分隔符是什么?
  • 编辑了问题,一个班轮会更好,但我会很高兴有任何答案开始......谢谢......
  • 我一直不明白为什么人们认为单线更好。他们显然从来不需要维护其他人的单线。

标签: linux unix sed awk


【解决方案1】:

我可能会做这样的事情,使用awk:

% echo '2012-01-10 21:27:52.811,,ABC   -- No lat/long
2012-01-10 21:27:52.811,37.8889329,-112.1876328,XYZ  -- with lat long
' | awk -F',' -v OFS=','  '
$2 && $3 {
    $2 = "\"" $2
    $3 = $3 "\""
}

1
'
2012-01-10 21:27:52.811,,ABC   -- No lat/long
2012-01-10 21:27:52.811,"37.8889329,-112.1876328",XYZ  -- with lat long

这假定字段在输入和输出时以逗号分隔。

如果填充了第二个和第三个字段,那么

  • 在第二个字段之前添加"
  • 在第三个字段后添加"

打印所有行 (1)。

这里有很多假设,所以你必须挖掘出sed & awk book 并对其进行调整以满足你的需求。

【讨论】:

  • @learner 这将是这个很好的解决方案的单行 - awk '$2{$2="\""$2;$3=$3"\""}1' FS=OFS=',' filename ... +1 解决方案
  • @Jaypal:我故意没有把这些都放在一条线上。感谢您说明原因!
【解决方案2】:

这可能对你有用:

sed '/^[^,]*,,/!s/,\([^,]*,[^,]*\)/,"\1"/' file
2012-01-10 21:27:52.811,,ABC   -- No lat/long
2012-01-10 21:27:52.811,"37.8889329,-112.1876328",XYZ  -- with lat long

【讨论】:

    【解决方案3】:

    给定约束,您可以使用 sed 并指定要更改的字段:

    sed '/,,/! s/,/,"/1; s/,/",/3'
    

    这通过将替换限制在两个逗号,, 不一起出现的那些行中起作用。在将进行替换的行中,我们使用数字标志在第一个逗号之后和第三个逗号之前添加双引号。

    【讨论】:

      【解决方案4】:

      只需使用 bash:

      oldIFS=$IFS
      IFS=,
      
      while read a b c d; do
          if [[ -z "$d" ]]; then
              printf "%s,,%s\n" "$a" "$c"
          else
              printf "%s,\"%s,%s\",%s\n" "$a" "$b" "$c" "$d"
          fi
      done < filename > filename.new
      
      IFS=$oldIFS
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 1970-01-01
        • 2014-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多