【问题标题】:How to copy value from next line below it如何从它下面的下一行复制值
【发布时间】:2016-02-03 00:15:22
【问题描述】:

我正在研究 Sed 或 Awk 来解决这个问题,但我完全迷路了。没有起点。 我有一个包含一堆这些的文件,所以我正在考虑使用 delimiter(,) 并使用索引/数组来复制一个值并替换另一个索引/数组。

0001,324434344,Sterner,Erik B,B.A,1987
0002,324434344,Sterner,Erik B,M.A,2001,Columbia University

因为 array[6] 在第一行是空的。我想将数组 [6] 从第二行复制到第一行。我很清楚如何查看文件并确定 array[6] 为空,但是我只是不知道如何复制第二行 array[6] 并替换它之前的行。有什么提示吗? 结果应该是:

0001,324434344,Sterner,Erik B,B.A,1987,Columbia University
0002,324434344,Sterner,Erik B,M.A,2001,Columbia University

【问题讨论】:

  • 这里的字段分隔符是什么? “哥伦比亚大学”似乎在第 8 个逗号之后。另外,只是这两条线还是不同的东西?您可能必须在 awk 中循环两次文件:一次存储数据,然后打印它
  • 分隔符是逗号 (,),查看数组 [6] 我的错误。让我修一下。
  • 这里的唯一ID是什么?第一个字段?
  • 是的,我在回复时注意到,正在编辑哈哈。不过还是谢谢。
  • 是的,第一个字段是唯一的(自动递增)

标签: arrays bash perl awk sed


【解决方案1】:

反转线条!然后存储第六个字段的最新非空白值并在找到空白值时将其插入应该是微不足道的。完成后再次反转线条。

tac file.csv | perl -F, -alne '
  $last = $F[6] if $F[6]; 
  $F[6] ||= $last if $last; 
  print join ",", @F;
' | tac

如果您使用的是 BSD-derivative,则可以使用 tail -r 而不是 tac

【讨论】:

  • 谢谢 我试一试。
  • 天哪,这很完美。这比我需要的更有效,并且适合我的项目。谢谢!
【解决方案2】:

如果我们假设 ID 存储在第二列,例如,您可以说:

$ awk 'BEGIN{FS=OFS=","} FNR==NR {a[$2]=$NF; next} NF<7{$(NF+1)=a[$2]}1' file file
0001,324434344,Sterner,Erik B,B.A,1987,Columbia University
0002,324434344,Sterner,Erik B,M.A,2001,Columbia University

这会读取文件两次:一次存储数据,然后打印它。

在第一次迭代时,它会填充一个数组 data[2nd field] = last field。然后,如果该行包含少于 7 列,则在第二次迭代中添加该字段。

【讨论】:

  • 您不必复制$,这只是我复制的提示,然后显示输出。
  • 啊,菜鸟的错误,错过了,哈哈。谢谢工作就像一个魅力!我很感激。
猜你喜欢
  • 1970-01-01
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多