【问题标题】:Populate a CSV column according to the value of another column根据另一列的值填充 CSV 列
【发布时间】:2020-02-17 00:46:53
【问题描述】:

在 Bash 脚本中,我想根据另一列(第 1 列)的值填充一个当前为空的列(第 5 列)。

我想我可以使用awk 来达到预期的效果,但是我的语法有问题:

awk -F, '
$1~/sld_[a-z]{3}[0-9]{4}_[0-9]{4}_f_[0-9]{3}[a-z]\.tif$/{$5="Text"}
$1~/sld_[a-z]{3}[0-9]{4}_[0-9]{4}_[a-b]_[0-9]{1,3}[a-z]?\.tif$/{$5="Front matter"}
$1~/sld_[a-z]{3}[0-9]{4}_[0-9]{4}_y_[0-9]{1,3}[a-z]?\.tif$/{$5="Back matter"}
$1~/sld_[a-z]{3}[0-9]{4}_[0-9]{4}_z_1[a-z]?\.tif$/{$5="Back matter"}
' file.csv

我的输入如下所示:

File Name,Item Sequence,Visibility,Title
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0001_a_1.tif,1,discovery,Front Board Outside
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0002_a_1a.tif,2,discovery,Front Board Outside
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0003_b_000.tif,3,discovery,Front Board Inside
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0009_b_003v.tif,9,discovery,Flyleaf 003v
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0010_f_001r.tif,10,discovery,f. 001r
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0060_y_001r.tif,60,discovery,Flyleaf 001r
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0070_y_999.tif,70,discovery,Back Board Inside
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0071_z_1.tif,71,discovery,Back Board Outside
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0072_z_1a.tif,72,discovery,Back Board Outside
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0073_z_2.tif,73,discovery,Spine
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0074_z_3.tif,74,discovery,Fore edge

所需的结果应该如下所示,其中第五列 (IIIF Range) 已由我在上面分配的值(Front matterTextBack matter 和空白)填充,基于第 1 列的值 (File Name):

File Name,Item Sequence,Visibility,Title,IIIF Range
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0001_a_1.tif,1,discovery,Front Board Outside,Front matter
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0002_a_1a.tif,2,discovery,Front Board Outside,Front matter
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0003_b_000.tif,3,discovery,Front Board Inside,Front matter
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0009_b_003v.tif,9,discovery,Flyleaf 003v,Front matter
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0010_f_001r.tif,10,discovery,f. 001r,Text
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0060_y_001r.tif,60,discovery,Flyleaf 001r,Back matter
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0070_y_999.tif,70,discovery,Back Board Inside,Back matter
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0071_z_1.tif,71,discovery,Back Board Outside,Back matter
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0072_z_1a.tif,72,discovery,Back Board Outside,Back matter
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0073_z_2.tif,73,discovery,Spine,,  
Masters/sinaimasters/ara/arabic_0695/sld_arb0695_0074_z_3.tif,74,discovery,Fore edge,,

【问题讨论】:

  • edit 您的问题包括文本(不是图像也不是链接)简洁、可测试的示例输入和预期输出,以便我们为您提供帮助。还包括这个问题独立所需的所有内容,不要包含指向其他问题的链接,并希望人们会阅读试图拼凑你当前所问的内容。如果不清楚,请参阅How to Ask
  • 发布示例链接并没有真正的帮助,我什至不会点击它们。请创建一个minimal reproducible example 并将其包含在您的问题中
  • 是否有能够理解 \w\d 之类的 awk 版本?
  • 感谢@EdMorton 的反馈;请查看我的问题的编辑版本。
  • 感谢@oguzismail 的反馈;请查看我的问题的编辑版本。

标签: regex bash csv awk


【解决方案1】:

您可以使用~ 运算符将字符串与正则表达式模式匹配:

awk -F, 'BEGIN{OFS=","}
$1~/sld_[a-z]{3}[0-9]{4}_[0-9]{4}_f_[0-9]{3}[a-z]\.tif$/{$5="Text"}
$1~/sld_[a-z]{3}[0-9]{4}_[0-9]{4}_[a-b]_[0-9]{1,3}[a-z]?\.tif$/{$5="Front matter"}
$1~/sld_[a-z]{3}[0-9]{4}_[0-9]{4}_y_[0-9]{1,3}[a-z]?\.tif$/{$5="Back matter"}
$1~/sld_[a-z]{3}[0-9]{4}_[0-9]{4}_z_1[a-z]?\.tif$/{$5="Back matter"}
1' file.csv

【讨论】:

  • 谢谢。我会得到的错误消失了,但是这个awk 并没有影响输出,第五列都是空白的。
  • CSV 的字段分隔符是什么?如果不是空格,则应使用 -F 选项指定它。
  • 它是逗号分隔的,我已经更新了我的问题以反映这一点。
  • 在这种情况下,您需要 -F, 选项。我已经相应地更新了我的答案。
  • 仍然不影响结果。我不知道是什么原因造成的。
猜你喜欢
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多