【问题标题】:How could I put these lines in range format?我怎么能把这些行放在范围格式?
【发布时间】:2018-01-27 07:37:23
【问题描述】:

我有一个包含 826,838 行的文本文件。 Text file looks like this(抱歉,图片上传器无法正常工作)。

我正在使用 sed (sed -n '2p;$p') 打印第二行和最后一行,但不知道如何以范围格式放置这些行。

当前输出:

     1    3008.00   7380.00  497724.00  3158482.00  497724.00   3158482.00
826838    4744.00   7409.00  480729.00  3207718.00  480729.00   3207718.00

期望的输出:

1-826838  3008.00-4744.00  7380.00-7409.00  497724.00-480729.00  3158482.00-3207718.00  497724.00-480729.00  3158482.00-3207718.00

感谢您的帮助!

【问题讨论】:

  • 也许将每个值保存在 var 中(使用 cut 和 grep),然后连接变量,最后打印结果。但这听起来很野蛮,所以我不会将其作为相关解决方案发布。

标签: bash awk sed


【解决方案1】:

使用单个 awk 表达式(将获取所需的行并生成所需的范围):

awk 'NR==2{ split($0,a) }END{ for(i=1;i<=NF;i++) printf("%s\t",a[i]"-"$i); print "" }' file

输出:

1-826838    3008.00-4744.00 7380.00-7409.00 497724.00-480729.00 3158482.00-3207718.00   497724.00-480729.00 3158482.00-3207718.00   

【讨论】:

  • 谢谢先生。这很棒。
  • 所以该文本文件的名称是:“MP6060_Line_Section_1728P2-078-After_Merge_0001.trhdr”。我正在尝试在输出的开头添加它。最好的方法是什么?再次感谢您的帮助
  • @c47v3770 您可以在 BEGIN 部​​分前面添加:BEGIN{print "MP6060_Line_Section_1728P2-078-After_Merge_0001.trhdr"}
  • @RavinderSingh13,你没看明白:应该是NR==2 因为初始文件是一个有826,838行的文本文件。它应该打印第二行和最后一行。此外,我希望你不要编辑我的答案
  • 抱歉我的错误,没看懂。以后会注意编辑,不要碰。
【解决方案2】:

这可能对你有用(GNU sed):

sed -r '2H;$!d;H;x;:a;s/\n\s*(\S+)\s*(.*\n)\s*(\S+\s*)/\1-\3\n\2/;ta;P;d' file

将第 2 行和最后一行存储在保持空间 (HS) 中。在最后一行之后,交换到 HS,然后将第二行和第三行的第一个字段重复移动到第一行。最后只打印第一行。

【讨论】:

  • 感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2021-07-14
  • 2017-05-25
  • 2020-05-12
  • 2019-11-23
  • 2021-12-22
  • 2020-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多