유닉스 파일의 텍스트 처리

유닉스 파일의 텍스트 처리

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

도움이 되었기를 바랍니다!

관련 정보