重新排列文本文件中的列范围

Rearrange ranges of columns in a text file

我想重新排列文本文件中的某些列。

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

我可以用 awk 暴力破解,但这似乎很愚蠢。有什么建议吗?

您可以组合使用 awkcut 假设字段之间用白色分隔 space:

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

例如:

$ seq 32 | paste -s | 
  awk '{=;=}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

我假设您的意思是文件的每一行都包含 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"]

如果您希望 return 单个字符串,请将另一个 join 添加到末尾:

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