我在 unix 平面文件中有以下数据,我想抑制前两列中的重复值并将其转换,如下所示:
1:x:4:3:2:y
1:x:7:9:l:z
1:0:3:j:k:m
2:9:r:s:6:u
2:m:y:5:7:9
2:u:7:9:7:6
3:a:b:c:d:e
3:a:b:d:e:f
3:a:b:n:r:s
到:
1:x:4:3:2:y
: :7:9:l:z
:0:3:j:k:m
2:9:r:s:6:u
:m:y:5:7:9
:u:7:9:7:6
3:a:b:c:d:e
: :b:d:e:f
: :b:n:r:s
答案1
直接用awk
:
$ awk -F':' '++a[$1] > 1{ $1=" " }++b[$2] > 1{ $2=" " }1' OFS=':' inp_file
1:x:4:3:2:y
: :7:9:l:z
:0:3:j:k:m
2:9:r:s:6:u
:m:y:5:7:9
:u:7:9:7:6
3:a:b:c:d:e
: :b:d:e:f
: :b:n:r:s
答案2
正如@Naga 在评论中提到的,Ruby 脚本是允许的。在这里我想出了一个解决方案。
红宝石脚本
#!/usr/bin/env ruby
# Frozen_String_Literal: false
$-v = nil
d, $-s, i, $,, $; = [], ?\s.freeze, '', ?:.freeze, ?:.freeze
::FILENAME = $*[0] || abort("Pass the filename as Argument.\nExample:\n\t#{File.basename($0)} hello.rb")
puts IO.readlines(File.join(Dir.pwd, FILENAME)).map! { |x|
c = x.tap(&:strip!).split
d.clear && i.replace(c[0].to_s) if i != c[0]
a = c.first(2).map { |y| d.find { |z| z.include?(y) } ? $-s : y }.join << $, << c.drop(2).join unless c.empty?
d << c.first(2).join
a
} rescue exit!
跑步
ruby scriptname.rb inputfile.txt
输出
[假设 inputfile.txt 包含问题中相同的数据]
1:x:4:3:2:y
: :7:9:l:z
:0:3:j:k:m
2:9:r:s:6:u
:m:y:5:7:9
:u:7:9:7:6
3:a:b:c:d:e
: :b:d:e:f
: :b:n:r:s
希望这可以帮助!