[완료]awk, sed 및 쉘 등을 사용하여...나올수있는형식...문의

shwezarl의 이미지

다음과 같은 파일이 있는데요
cat a.log

1:5208::46:::::0:0:0:58472609:17283700:::::
2:5208::46:::::0:0:0:58490160:17292236:::::
3:5208::6:::::0:0:0:58474985:17297424:::::
.
.
.
47:5208::6:::::0:0:0:58465929:17300406:::::
48:5208::6:::::0:0:0:58481078:17300864:::::
49:5208::46:::::0:0:0:58502366:17302819:::::
50:5208::1:::::0:0:0:58473093:17303859:::::

에서...
cat b.log 파일

1:5208::46:::::0:0:0:58472609:17283700:::::
2:5208::46:::::0:0:0:58490160:17292236:::::
3:5208::6:::::0:0:0:58474985:17297424:::::
.
.
.
이고요...맨앞 필드가 아이디 인데요... a.log 파일은 중간중간 빠져서 1 -> 2 -> 5 -> 8 이런식으로 갈수도있고요~ 그래서 라인이 100라인 이라도 아이디가 2000번으로 끝날수도 있는..
b.log 파일은 신규로 생각해서 순서대로 쭉 제대로 있는데...

질문은 두개의 파일을 합치는데... b파일을 a파일에 합치는...cat b.log >> a.log 이렇게..해서... 예전엔 붙인후에 awk나 sed를 이용해 다시 차례대로 소팅해서 사용했는데..기존 a.log파일의
변경기록 관리가 안되어서...ㅠㅠ

b.log 파일이 a에 붙으면서...맨앞 아이디 필드가 1 2 이게..51 52 ...이렇게 해서 붙게 할려고하는데 맘대로 안되네요~

원하는결과 결과...
1:5208::46:::::0:0:0:58472609:17283700:::::
2:5208::46:::::0:0:0:58490160:17292236:::::
3:5208::6:::::0:0:0:58474985:17297424:::::
47:5208::6:::::0:0:0:58465929:17300406:::::
48:5208::6:::::0:0:0:58481078:17300864:::::
49:5208::46:::::0:0:0:58502366:17302819:::::
50:5208::1:::::0:0:0:58473093:17303859::::: <----여기까지 a.log 파일
51:5208::46:::::0:0:0:58472609:17283700::::: <----여기서부터 b.log파일
52:5208::46:::::0:0:0:58490160:17292236:::::
53:5208::6:::::0:0:0:58474985:17297424:::::

도와주세요~

aero의 이미지

.
.
.
.
이렇게

#!/bin/sh
cat a.txt
id=`tail -1 a.txt | awk 'BEGIN{FS=":"}{print $1}'`
awk -v num="$id" 'BEGIN{FS=":"}{if ($1>num) print $0}' b.txt

설명은 생략~
shwezarl의 이미지

설명이 없어서..맞게 이해한지 모르겠는데요..

이렇게 하면 a.txt파일의 마지막 아이디를 변수로 잡아서 b.txt파일에서 그아이디 보다 큰것만

출력...? 이런뜻아닌가여?

b.txt파일에 a.txt파일 id보다 큰것이 없으면 붙여넣기가 안되는거 아닌가요?

b.txt파일을 전부 a.txt파일에 붙여넣기 하고싶은데요..b.txt파일의 아이디는 a.txt파일 마지막

아이디 다음부터 다시 정렬되면서요...

aero의 이미지

.
.
.

아~ 문제를 좀 잘 못 이해했군요. 그럼 다시
a.txt

1:5208::46:::::0:0:0:58472609:17283700:::::
2:5208::46:::::0:0:0:58490160:17292236:::::
3:5208::6:::::0:0:0:58474985:17297424:::::
47:5208::6:::::0:0:0:58465929:17300406:::::
48:5208::6:::::0:0:0:58481078:17300864:::::
49:5208::46:::::0:0:0:58502366:17302819:::::
50:5208::1:::::0:0:0:58473093:17303859:::::

b.txt
1:5208::36:::::0:0:0:73472609:27283700:::::
2:5208::26:::::0:0:0:72490160:27292236:::::
3:5208::16:::::0:0:0:78474985:27297424:::::
4:5208::26:::::0:0:0:78474985:27297424:::::
5:5208::36:::::0:0:0:78474985:27297424:::::

스크립트

#!/bin/sh
cat a.txt
id=`tail -1 a.txt | awk 'BEGIN{FS=":"}{print $1}'`
awk -v num="$id" '{ match( $0, /([^:]*?)(.*)/, a); printf( "%d%s\n", num+a[1], a[2]) }' b.txt

결과

1:5208::46:::::0:0:0:58472609:17283700:::::
2:5208::46:::::0:0:0:58490160:17292236:::::
3:5208::6:::::0:0:0:58474985:17297424:::::
47:5208::6:::::0:0:0:58465929:17300406:::::
48:5208::6:::::0:0:0:58481078:17300864:::::
49:5208::46:::::0:0:0:58502366:17302819:::::
50:5208::1:::::0:0:0:58473093:17303859:::::
51:5208::36:::::0:0:0:73472609:27283700:::::
52:5208::26:::::0:0:0:72490160:27292236:::::
53:5208::16:::::0:0:0:78474985:27297424:::::
54:5208::26:::::0:0:0:78474985:27297424:::::
55:5208::36:::::0:0:0:78474985:27297424:::::

Perl로 하면 깔끔하겠지만 쉘로하시는 걸 원하시니 약간은 dirty할 수 밖에 없는~

shwezarl의 이미지

match(s,r) 문자열 s에서 정규표현식 r과 매칭되는 부분의 위치를 넘겨준다.

이렇게 써있는데요

match( $0, /([^:]*?)(.*)/, a) 인수가 3개네요... 정규식표현과...a..

$0전체줄을 "처음부터 한줄"을 a로 받아서 a[1] 첫번째 필드에 num 더하고.. a[2]두번째 필드

출력인가요?

이해가 잘안되니...제것으로 만들기가..힘드네요~ㅎㅎ

시간되시면 Perl으로도...부탁드려요~^^ 설명도좀...ㅎㅎ

aero의 이미지

match 의 3인자는
대상스트링,정규표현식,배열명 으로
정규표현식에서 그룹핑(grouping)된 것 정규식에서 ( )로 묶은 부분이
차례로 배열에 들어가게 됩니다. 그래서 첫번째 그룹핑 ([^:]*?) 는 a[1]이
두번째 그룹핑 (.*) 는 a[2]가 되는거지요.

shwezarl의 이미지

^^

aero의 이미지

.
.
.
한 번 쓰고 버릴 one-liner 면 이렇게~

 perl -e 'open A,$ARGV[0];open B,$ARGV[1];print @a=<A>;$n=(split /:/,$a[-1])[0];map { s/^([^:]+)/$n+$1/e; print } <B>' a.txt b.txt

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.