【问题标题】:Print, modify, print again Bash variable打印、修改、再次打印 Bash 变量
【发布时间】:2016-09-25 12:13:39
【问题描述】:

我正在遍历一个 CSV 文件。文件的每一行的格式如下(它是 Open Street Maps 数据):

planet_85.287_27.665_51a5fb91,AcDbEntity:AcDbPolyline,{ [名称] Purano Bus Park-Thimi [type] route [route] microbus [ref] 10 } { [Id] 13.0 [Srid] 3857 [FieldsTableId]

以下格式:

图层、子类、扩展实体、线型、实体句柄、文本

我想为Name 添加一个新列。我可以通过截断 [name] 之前和 [.此代码成功创建了一个包含所有名称的换行符文件(我将其作为 CSV 打开,然后将其复制粘贴到原始文件中作为新列)。

cat /path/to/myfile.csv | while read line
    do
    if [[ ${line} == *"name"* ]]
        then
            printf "$(echo $line | LC_ALL=C sed 's/^.*name\]//g'| LC_ALL=C cut -f1 -d'[') \n"
        else
            printf "\n"
    fi
done >/path/to/newrow.csv

这个系统显然不是最理想的——我更愿意打印整个最后一行。但是当我用这个替换 printf 行时:

printf "$line,$(echo $line | LC_ALL=C sed 's/^.*name\]//g'| LC_ALL=C cut -f1 -d'[') \n"

它打印行但不打印名称。我尝试在单独的打印语句中打印它们,打印行然后回显名称,将名称保存在变量中然后打印,以及许多其他技术,每次我要么a)只打印行,要么b) 在新行上打印名称,这会破坏 CSV 格式。

我做错了什么?如何打印完整的原始行,并将名称附加为末尾的新列?

注意:我在 MacBook Pro 15" Retina 上的 macOS Sierra 上的终端中运行它。

【问题讨论】:

  • 仅供参考 -- 使用 printf,替换只能在后续参数中,而不是格式字符串本身。
  • ...并且每行运行一次sedcut 非常、非常效率低下——如果你要在一行上进行处理——逐行,尝试改用bash-native string manipulation
  • @CharlesDuffy 感谢您的意见。明天我会阅读更多的手册页。我参加了关于 Bash 和 C 的非常严格的课程,但那可能是 5 个月前的事了,从那以后我没有做过任何课程,所以目前我完全没有练习!
  • 顺便说一句,LC_ALL=C 通常是矫枉过正。根据您要抑制的警告的具体内容,您可能可以使用LC_CTYPE=CLC_COLLATE=C(如果您愿意,只在脚本顶部导出一次);这样错误消息和日期/时间格式仍然适合用户的首选语言。

标签: bash macos shell csv printf


【解决方案1】:

如果我理解正确,您想提取[name][type] 之间的名称,并附加为新的最后一个 CSV 列。您可以使用捕获组来做到这一点:

sed -e 's/.*\[name\] \(.*\) \[type\].*/&,\1/' < input

注意中间的\(.*\)。这将捕获[name][type] 之间的文本。

在替换字符串中,&amp; 代表匹配的字符串,即整行,因为模式以.* 开头和结尾。 接下来,是一个文字逗号,\1代表第一个捕获组的内容,在\(...\)中匹配的部分。

【讨论】:

  • 这行得通,谢谢。也就是说,macOS 用户在使用 sed 和其他此类工具时必须添加 LC_ALL=C 以避免警告。
  • 没有必要。这取决于您的环境设置。我也在 OSX 上,我不需要添加它,我有 LC_ALL=en_US.UTF-8
  • 有趣 - 您是否做了一些特别的事情来设置您的机器以使用更标准的 SED?还是我在使用 BSD 版本的 Sierra 上?
  • 据我所知,OSX 一直使用 BSD。出现这些警告是不正常的,而不是标准系统的行为。某处有原因,您需要调试。 superuser.com 可能会有所帮助。祝你好运!
猜你喜欢
  • 2016-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-09
  • 1970-01-01
相关资源
最近更新 更多