2013-07-01 2 views
6

나는 순수 this 질문에 대한 해결책을 찾기 위해 몇 시간을 보냈습니다. 분명히, 불행히도 나는 성공하지 못했습니다. 정말 까다로운 질문입니다. 합니다 (AWK 질문에서) 순수한 sed와 컬럼의 복잡한 전치


예 :

  • 입력 :
 
aaa 111  
aaa 222 
aaa 333 
bbb 444 
bbb 555 
ccc 666 
  • 출력 :
17,451,515,
  • 입력
 
APM00065101435 189 
APM00065101435 190 
APM00065101435 191 
APM00065101435 390 
190104555 00C7 
190104555 00D1 
190104555 00E1 
190104555 0454 
190104555 0462 
APM00065101435 391 
APM00065101435 392 
  • 출력은
 
APM00065101435 189,190,191,390 
190104555 00C7,00D1,00E1,0454,0462 
APM00065101435 391,392 

나는 무엇 시도? 내 비 작업 예제의 일부 :이 글을 읽고에 대한

 
sed -nr '1{h;b};H;x;/(\S+).*\n\1.*\'/M{x;b};s/.*\'//m;s/\n\S*\s*/,/g;s/,$//;p' file 
sed -nr '1{h;b};H;x;h;s/(\S+).*\n(\S+).*\'/\1\n\2/m;/(\S+)\n\1\'/M{$!b;g;bk};g;s/\n.*\'//m;:k;s/^\S+\s//2mg;s/\n/,/g;p;x;s/.*\n//;h;$l' file2 
sed -nr 'H;g;s/(\S+)\s.*/\1/gm;/(\S+)\n\1\'/M{$!b;g;bk};g;1d;s/\n.*\'//m;:k;s/\n\S+\s/,/2g;s/\n//;p;g;s/\n.*(\n.*)$/\1/;h' file2 

감사합니다.

+0

어 ...이게 가능할 수도 있지만 ... 나는 그것이 맞는지 아닌지 알아 내 시간을 낭비하려고하지 않을 것입니다! 왜 순수한 솔루션을 원하십니까? 이 문제는 awk에 대한 스냅입니다 ... 왜 인생을 더 힘들게 만드나요? –

+0

이것에 대한 해결책은'awk' 또는'perl'에서 더 읽기 쉽고 유지 보수가 용이하며 유니콘을 꿈꾸게 할 것입니다 !! 유니콘 (unicorn) 남자를 위해서 (또는 [potong] (http://stackoverflow.com/users/967492/potong) 깨어날 때까지 기다리십시오!) !! –

답변

5

이 (GNU가 나오지도) 당신을 위해 일 수 있습니다

sed -r ':a;$!N;s/^(([^ ]+).*)\n\2/\1,/;ta;P;D' file 

또는 당신이 선호하는 경우 :

sed -r ':a;$!N;s/^((\S+\s).*)\n\2/\1,/;ta;P;D' file 

이 패턴 공간에 2 개 라인을 읽고는, 각 줄의 시작을 비교 동일한 경우 두 번째 줄의 처음을 쉼표로 바꾸고 반복합니다. 행이 일치하지 않으면 첫 행을 출력합니다.

+0

감사합니다, potong. 너 나를 다시 도왔다. 나는 너에게 아주 많이 감사하고있다. 고마워. 내가 할 수 있다면 너에게 현상금을 지불 하겠어! – captcha