Linux 문자 추출 문의드립니다.

s0481의 이미지

"로 시작하고 ;로 끝나는 문자를 추출하려고 합니다.
아래는 파일 내용입니다.

$cat TEST_FILE
ABC"DEF;G
AB
C"DE
F;G

grep "\".*;" TEST_FILE 명령문으로 실행해보았습니다
그럼 결과가

ABCDEFG

만 출력이 됩니다.

제가 원하는 문자열은 아래와 같습니다.

DEF
DEF

첫번째 문제)
문자열중 DEF에 해당하는 문자만 추출하려합니다.
하지만 ABCDEFG 모두 출력이됩니다..

두번째 문제)
행이 다른 케이스가 존재합니다.
이럴 경우 위의 grep 명령문으로는 조회가 불가능한 것 같습니다..

두가지 문제를 해결하려면 명령을 어떻게 수정해야할까요?
리눅스를 공부한지 얼마 되지 않아 실력이 많이 부족합니다.
부탁드립니다ㅠ

swish95의 이미지

첫번째가 기대하는 답이

ABC"DEF;G 

혹은
"DEF;

인지요?

두번째 문제도

 
C"DE
F;G

와 같이 나오기를 원하시나요?

------------------------------------------------------------
ProgrammingHolic

s0481의 이미지

예상결과값은

DEF
DEF

를 원하고

실제 추출되는 문자열은

ABCDEF
입니다.
swish95의 이미지

첫번째 문제는 sed 를 사용하면 해결됩니다.

grep -o "\".*;" TEST_FILE | sed 's/[\";]//g'

하지만 두번째 문제는 grep 이 기본적으로 line 단위로 검색하기 때문에 해결이 안될꺼 같네요 ^^

------------------------------------------------------------
ProgrammingHolic

s0481의 이미지

감사합니다! 덕분에 이것 저것 찾아보면서 공부 했네요

파이썬3의 이미지

# -*- coding: utf-8 -*-
 
import re
 
raw_data = """\
ABC"DEF;G
"""
data = raw_data.strip()
 
s1 = "\""
s2 = ";"
 
m1 = re.search("\"", data)
m2 = re.search(";", data)
 
i1 = m1.start() + 1
i2 = m2.start()
 
result = data[i1:i2]
 
print(result) # DEF (파이썬 3.7)
파이썬3 의 이미지

m1 = re.search(s1, data)
m2 = re.search(s2, data)

요렇게 정정합니다;;;
황병희의 이미지

원본자료에 두번째꺼는 추출이 힘든데,,,
원본자료의 줄바꿈 문자를 공백으로 치환후
추출하면 선생께서 원하는 값을 파이썬으로도 얻을 수 있더라구요,,,

# -*- coding: utf-8 -*-
 
import re
 
raw_data = """\
ABC"DEF;G
AB
C"DE
F;G
"""
 
data = raw_data.replace("\n", "")
exp = re.compile("\"([A-Z]+);")
result = exp.findall(data)
 
print(result) # ['DEF', 'DEF'] (파이썬 3.7)

findall 은 리스트로 결과값을 돌려주는데
저걸 문자형으로 결과값을 받고싶으면 아래처럼
for문이 도와줍니다;;;

for k in result:
    print(k)

[우분투 18.04 파여폭스 나비에서 작성했습니다]

--
^고맙습니다 감사합니다_^))//

swish95의 이미지

cat TEST_FILE | tr "\n" "\t" | grep -oE "\".*?;" | sed 's/[\";]//g' | sed "s/$(printf '\t')//g"

참고로 tab 치환은 shell 마다 다른 형식을 취하고 있으니 tab 대신 사용되지 않는 다른 문자를 쓰면 좀 간단해 지겠죠
예를 들어 "$" 문자가 데이타에 없다고 하면

cat TEST_FILE | tr "\n" "$" | grep -oE "\".*?;" | sed 's/[\";$]//g'

하지만 이렇게 하면 대용량 파일일때 문제가 ㅠ.ㅠ

가능하다면 라인단위로 읽어서 처리하도록 별도의 프로그램으로 만드는게 좋겟습니다.

------------------------------------------------------------
ProgrammingHolic

황병희의 이미지

Quote:
하지만 이렇게 하면 대용량 파일일때 문제가 ㅠ.ㅠ

아 정말 이문제가 걸릴거 같네요,, 좋은 코드 공유에 감사드립니다!!!

[우분투 18.04 파여폭스 나비에서 작성했습니다]

--
^고맙습니다 감사합니다_^))//

황병희의 이미지

https://gitlab.com/soyeomul/test/blob/master/162547.py

한줄씩 처리하되, 두번째 결과값도 함께 나오도록 만드는 코드는 실패했네요...
두번째 결과값도 나오면서 (파이썬으로) 한줄씩 처리하도록 하는 코드는 마치 물과 불을 합치는 경지?

아따 이건 파이썬 숙제로 남을거 같습니다... 꾸벅,,,

[크롬OS 에서 작성했습니다]

--
^고맙습니다 감사합니다_^))//

ymir의 이미지

$ cat in.txt
ABC"DEF;G
AB
C"DE
F;G
$ cat in.txt | grep -oz '"[^;]\+'
"DEF"DE
F$ cat in.txt | grep -oz '"[^;]\+' | tr '\0' '\n'
"DEF
"DE
F
$ cat in.txt | grep -oz '"[^;]\+' | tr '\0' '\n' | tr -d '"'
DEF
DE
F
$ cat in.txt | grep -oz '"[^;]\+;' | tr '\0' '\n'
"DEF;
"DE
F;

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

ymir의 이미지

$ cat in.txt | grep -oz '"[^;]\+' | tr -d '\n\"' | tr '\0' '\n'
DEF
DEF

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

zzzzzz의 이미지

이분은 정규표현식을 정말 잘쓰는듯!

황병희의 이미지

(bionic)soyeomul@localhost:~/111$ python3 6.py TEST_FILE
['DEF', 'DEF']

# -*- coding: utf-8 -*-
 
"""
비슷한 유형의 문제: KLDP 162741
 
산법 요약: 행단위로 읽는 대신,
파일내 모든 내용을 한 문자씩 개별적으로 나열하여 탐색하는 방식으로 구현하면 
구분자(";)가 어느 위치에 존재하더라도 결과 추출 가능합니다.
"""
 
import sys
 
def make_ch(x):
    f = open(x, "r")
    for line in f:
        for ch in line:
            yield ch
 
    f.close()
 
my_ch = make_ch(sys.argv[1])
 
my_ch_lst = []
 
while True:
    try:
        my_ch_lst.append(next(my_ch))
    except:
        break
 
i = []
j = []
 
for idx in range(0, len(my_ch_lst)):
    if "\"" in my_ch_lst[idx]:
        i.append(idx)
    if ";" in my_ch_lst[idx]:
        j.append(idx)
 
result = []
 
for k, v in zip(i, j):
    result.append("".join(my_ch_lst[k+1:v]))
 
result = [x.replace("\n", "") for x in result]
 
print(result)

[우분투 18.04 파여폭스 나비에서 작성했습니다]

--
^고맙습니다 감사합니다_^))//

익명 사용자의 이미지

파이선님 가시는데 루비가 빠질 수 없죠.
저번 코드에서 아쉬운 점을 고쳤습니다.
군더더기 없이 깔끔하네요

#!/usr/bin/ruby
 
c1       = ARGV[0]
c2       = ARGV[1]
filename = ARGV[2]
 
if ARGV.size != 3 or c1.size != 1 or c2.size != 1
  puts "Usage:   ruby ./sample.rb c1 c2 filename"
  puts "The c1, c2 should be one character"
  puts "Example: ruby ./sample.rb \\\" \\\; filename"
  puts "         ruby ./sample.rb a b filename"
  exit
end
 
c1_offset = 0
c2_offset = 0
 
file = File.open(filename)
 
until file.eof?
  case file.read(1)
  when c1
    c1_offset = file.pos if c1_offset == 0
  when c2
    c2_offset = file.pos - 1 if c2_offset == 0
  end
 
  if c1_offset > 0 and c2_offset > 0
    file.seek(c1_offset, IO::SEEK_SET)
    puts file.read(c2_offset - c1_offset).delete("\n")
    file.seek(1, IO::SEEK_CUR)
    c1_offset = 0
    c2_offset = 0
  end
end
 
file.close
황병희의 이미지

(bionic)soyeomul@localhost:~/111$ ruby --version
ruby 2.5.1p57 (2018-03-29 revision 63029) [aarch64-linux-gnu]
(bionic)soyeomul@localhost:~/111$ ruby 1.rb \" \; TEST_FILE
DEF
DEF
(bionic)soyeomul@localhost:~/111$ 

깔끔 그 자체, 훌륭한 코드를 보여주셔서 감사합니다^^^

[우분투 18.04 파여폭스 나비에서 작성했습니다]

--
^고맙습니다 감사합니다_^))//

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.