【问题标题】:How to add missing characters to a line of text in a file using some scripting on UNIX?如何在 UNIX 上使用某些脚本将缺少的字符添加到文件中的一行文本中?
【发布时间】:2015-07-21 20:39:16
【问题描述】:

我编写了一个程序,它从文件中读取数据并将它们插入到表中。

每一行都有变量,每两个变量之间有一个逗号。每行是表格的不同行。我想制作一个 unix 脚本,它将用 100 行打开文件并读取每一行并计算脚本将找到的,。之后我希望它编辑每一行并用 , 填充该行,直到它们的数量为 50。

例如,我需要每行有 50 个逗号 (,)。如果我读到一行并且有 30 个,,我想在这一行中添加额外的 20 个逗号。

(第 1 行)

9,15040113501460,0,b1          0035569144,91    302317960883,0,15040113501460,132,15040614170560,N,0,0,0,0,0,0,0,0,0,0,8,0,0000000000000000,0,0,2,,27,b1          003st69144,1

(第 2 行)

9,15350114601560,0,b1          0033765345,91    304294596921,0,15040113501560,132,15040610170260,N,0,0,0,0,0,0,0,0,0,0,8,0,0000000000000000,0,0,2,,27,b1          0031r69144,1

这是文件的格式。每一行都会是这样。


说明:

程序需要读取 50 个变量。所以它期望 49 ,。当文件像上面那样并且变量较少时,我将面临错误。所以我需要一个unix脚本来添加缺少的,,以便将它们作为null。

【问题讨论】:

  • 我不能共享代码,因为有公司保密协议。程序只是读取每一行并将值放入变量直到行结束。我需要计算每行的 ',' 并添加 ',,,,,,,' 以便将缺少的变量插入为 null ..
  • stackoverflow.com/questions/1603566/… 这是类似的东西,但我需要计算 ',' 而不是替换它。只需添加 49(50 个变量,所以 49 ',') - (当前 ',' 的计数) 在每一行

标签: bash shell unix awk text-parsing


【解决方案1】:

我使用了相同的方法,但我注意到它在末尾产生了一个额外的逗号,所以我调整了原来的方法,在末尾不添加逗号:

awk -F, 'NF <= 50 {printf $0; for(i = NF; i < 50; ++i)  printf ","; printf "\n" }'

【讨论】:

    【解决方案2】:

    您可以使用以下 awk 代码:

    awk -F"," 'NF < 50 {printf $0; for(i = NF; i < 50; ++i)  printf ","; printf "\n" }' file
    

    生产

    9,15040113501460,0,b1          0035569144,91    302317960883,0,15040113501460,132,15040614170560,N,0,0,0,0,0,0,0,0,0,0,8,0,0000000000000000,0,0,2,,27,b1          003st69144,1,,,,,,,,,,,,,,,,,,,,
    9,15350114601560,0,b1          0033765345,91    304294596921,0,15040113501560,132,15040610170260,N,0,0,0,0,0,0,0,0,0,0,8,0,0000000000000000,0,0,2,,27,b1          0031r69144,1,,,,,,,,,,,,,,,,,,,,
    

    这里,NF 是每行的字段数,F 是字段分隔符。规则 sasys 如果您的字段少于 50 个(49 个逗号),我们会将缺少的字段添加到末尾。

    【讨论】:

    • 其实这个脚本只是打印..我想让它覆盖文件里面的数据..没有临时文件可以吗?
    • @cgxanth 是的,你可以写awk ... file &gt; newfile 并将内容放在新文件中(不要覆盖你的输入文件,这不起作用)。或者,gnu awk 有某种内联编辑模式。作为说明,我不确定我的脚本是否跳过了包含 50 个字段的行但打印了它们,或者它是否省略了它们。你应该检查一下。
    猜你喜欢
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    相关资源
    最近更新 更多