【问题标题】:Rearrange ranges of columns in a text file [closed]重新排列文本文件中的列范围[关闭]
【发布时间】:2016-08-02 02:30:52
【问题描述】:

我正在寻找重新排列文本文件中的某些列。

基本上我有 32 列,想要 1-4,6-29,5,32

我可以用 awk 强制执行此操作,但这似乎很愚蠢。有什么建议吗?

【问题讨论】:

  • 为什么急于选择答案?一般来说,快速选择可能会阻止其他可能更好的答案,甚至显示所选答案不正确。另外,您是否想到其他人可能仍在准备他们的答案?不用着急。这里的许多人至少要等几个小时才能做出选择。
  • 欢迎来到 Stack Overflow。请记住,地球需要 24 小时自转,而且由于 SO 有世界各地的人在做出贡献,等待一天来选择答案是非常明智的。抓住第一个,或者在第一个小时里抓住一个,可能会导致实现的答案不如 23 小时后的答案,因为可能需要一段时间来制定答案,测试它,然后写它起来。
  • 请阅读“How to Ask”、“minimal reproducible example”、codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-questioncatb.org/esr/faqs/smart-questions.html。照原样,您的问题缺少示例输入、示例输出和您的努力证据,例如您为解决问题而编写的代码。
  • 您目前接受的答案完全反映了您提出问题所付出的努力。它不适用于某些输入值,不能扩展为适用于“列”的其他组合,并且在 UNIX 安装中不可移植。祝你好运!

标签: ruby perl awk sed cut


【解决方案1】:

假设字段由空格分隔,您可以组合使用 awkcut

awk '{$30=$5;$31=$32}1' file | cut -d' ' -f5,32 --complement

例如:

$ seq 32 | paste -s | 
  awk '{$30=$5;$31=$32}1' | 
  cut -d' ' -f5,32 --complement

1 2 3 4 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 5 32

【讨论】:

    【解决方案2】:

    我假设您的意思是文件的每一行包含 32 个字符,后跟一个换行符,并且您希望提取由以下给出的相邻列组的字符串:

    column_groups = [1..4, 6..29, 5, 32]
    

    假设您已将输入文件读入一个数组并且

    line = "abcdefghijklmnopqrstuvwxyzABCDEF\n"
      #     0        10        20        30 (offsets)
    

    是该数组的一个元素。

    那么你可以这样做:

    range_offsets = column_groups.map do |obj|
      case obj
      when Range
        obj.first-1..obj.last-1
      else
        obj-1..obj-1
      end
    end
      #=> [0..3, 5..28, 4..4, 31..31]
    
    arr = line.chars
      #=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
      #    "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v",
      #    "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "\n"] 
    
    range_offsets.map { |range| arr.values_at(*[*range]).join }
      #=> ["abcd", "fghijklmnopqrstuvwxyzABC", "e", "F"]
    

    如果您希望返回单个字符串,请在末尾添加另一个 join

    range_offsets.map { |range| arr.values_at(*[*range]).join }.join
      #=> "abcdfghijklmnopqrstuvwxyzABCeF"
    

    【讨论】:

    • 不,32 列,不是 32 个字符。
    • 文本文件没有列。这就是为什么我认为你的意思是字符。您需要编辑您的问题以解释文件中每一行的内容。
    • @Will 这是您问题的一部分。 32 列可以而且通常确实意味着 32 个字符 - 因为您还没有发布 minimal reproducible example,即使是那些确实想帮助您的少数人,因为您提出问题所付出的努力只是猜测您想要什么.
    猜你喜欢
    • 2013-06-19
    • 1970-01-01
    • 2020-03-12
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 2015-08-28
    相关资源
    最近更新 更多