重新排列文本文件中的列范围
Rearrange ranges of columns in a text file
我想重新排列文本文件中的某些列。
基本上我有 32 列并且想要 1-4,6-29,5,32
我可以用 awk 暴力破解,但这似乎很愚蠢。有什么建议吗?
您可以组合使用 awk
和 cut
假设字段之间用白色分隔 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"
我想重新排列文本文件中的某些列。
基本上我有 32 列并且想要 1-4,6-29,5,32
我可以用 awk 暴力破解,但这似乎很愚蠢。有什么建议吗?
您可以组合使用 awk
和 cut
假设字段之间用白色分隔 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"