유닉스 공부중인데......

goodday의 이미지

주어진 파일에서 각 항목 별로 최댓값 최솟값을 구하는 방법을 모르겠네요.... 3일째 머리 골골 싸매고있는데 너무 힘들어서 함 여쭤봅니다...
A 10
A 20
A 30
A 40
A 50
B 13
B 13
B 14
B 15
C 43
C 412
C 423
C 431

이 파일에서
A의 최소값은 10 최대값은 50
B의 최소값은 13 최대값은 15
C의 최소값은 43 최대값은 431
이런식으로 뽑아내는 방법 없을까요 ㅠㅠ

파이썬3의 이미지

# -*- coding: utf-8 -*-
 
f = open("161705.txt", "r")
data = f.readlines()
 
list_A = []
for x in data:
    if 'A' in x:
        list_A.append(int(x.split()[1].strip()))
 
list_B = []
for x in data:
    if 'B' in x:
        list_B.append(int(x.split()[1].strip()))
 
list_C = []
for x in data:
    if 'C' in x:
        list_C.append(int(x.split()[1].strip()))
 
print("A최소값:", min(list_A), '\t', "A최대값:", max(list_A))
print("B최소값:", min(list_B), '\t', "B최대값:", max(list_B))
print("C최소값:", min(list_C), '\t', "C최대값:", max(list_C))
 
f.close()
 
# 편집: Emacs 26.1 (Ubuntu 18.04)
# 마지막 갱신: 2019년 6월 8일
 
"""
출력결과: 우분투 18.04, 파이썬 3.6.7
 
(bionic)soyeomul@localhost:~/test$ cat 161705.txt
A 10
A 20
A 30
A 40
A 50
B 13
B 13
B 14
B 15
C 43
C 412
C 423
C 431
(bionic)soyeomul@localhost:~/test$ python3 161705.py
A최소값: 10 	 A최대값: 50
B최소값: 13 	 B최대값: 15
C최소값: 43 	 C최대값: 431
(bionic)soyeomul@localhost:~/test$ 
"""
Hodong Kim@Google의 이미지

저는 루비로 해봤습니다.

#!/usr/bin/ruby
# -*- coding: utf-8 -*-
 
a = []
b = []
c = []
 
File.open("data.txt", "r") do |f|
  f.each_line do |line|
    if line.start_with?("A")
      a << line.split(" ")[1]
    elsif line.start_with?("B")
      b << line.split(" ")[1]
    elsif line.start_with?("C")
      c << line.split(" ")[1]
    end
  end
end
 
puts "A의 최소값은 #{a.min} 최대값은 #{a.max}"
puts "B의 최소값은 #{b.min} 최대값은 #{b.max}"
puts "C의 최소값은 #{c.min} 최대값은 #{c.max}"

hodong@debian:~$ ./data.rb 
A의 최소값은 10 최대값은 50
B의 최소값은 13 최대값은 15
C의 최소값은 412 최대값은 431

---
Become a Friend of GNOME

Hodong Kim@Google의 이미지

bash 문법이 C언어와 유사하지 않아서 공부해 놓으면 매번 까먹어서 sh 셀 스크립트 작성할 줄 몰라서. ㅎㅎㅎ 그래서 그냥 ruby 로 스크립트 만들어서 작업합니다. ㅎㅎ

---
Become a Friend of GNOME

황병희의 이미지

리스트에 집어넣는 a << ... 문법 하나 배우고 갑니다.
머찐 코드 감사드립니다^^^

--
ㄱㅅㅎㄴㄷ!

익명 사용자의 이미지

우승까진 안 바라지만 심심하니 참가합니다

def main(filename=None):
    from functools import reduce
 
    def open_or_stdin(filename):
        if filename:
            return open(filename, 'rt')
        else:
            from sys import stdin
            return stdin
 
    def parse(l):
        k, v = l.strip().split()
        return k, int(v, base=10)
 
    class MaxMin:
        __slots__ = 'min', 'max'
        def __init__(self, v):
            self.min = self.max = v
        def __iadd__(self, v):
            if v < self.min:
                self.min = v
            elif v > self.max:
                self.max = v
            return self
 
    def r(d, l):
        k, v = parse(l)
        if k in d:
            d[k] += v
        else:
            d[k] = MaxMin(v)
        return d
 
    with open_or_stdin(filename) as f:
        for k, v in reduce(r, f, {}).items():
            print('{:s}의 최소값은 {:d} 최대값은 {:d}'.format(k, v.min, v.max))
황병희의 이미지

마지막줄에
main(filename="161705.txt")
추가후 실행해보니 결과값이 아름답게 나오네요,,,
아름다운 코드 감사드립니다^^^

(bionic)soyeomul@localhost:~/test$ python3 161705-3.py 
A의 최소값은 10 최대값은 50
B의 최소값은 13 최대값은 15
C의 최소값은 43 최대값은 431
(bionic)soyeomul@localhost:~/test$ 

--
ㄱㅅㅎㄴㄷ!

익명 사용자의 이미지

bash awk command 입니다.

awk 'BEGIN{FS=OFS=" "} {if (a[$1]<$2) {a[$1]=$2; data[$1]=$0}} END{for (i in a) print data[i]}' data.txt 
 
data.txt
A 10
A 20
A 30
A 40
A 50
B 13
B 13
B 14
B 15
C 412
C 423
C 43
C 431
 
출력 결과:
A 50
B 15
C 431

익명 사용자의 이미지

글 올리고 보니 질문과는 좀 다른 결과이네요..

이런 방법도 있으니 참고만 하시길..

bushi의 이미지

bash >= 2.0

declare -A min
declare -A max
whats=
 
while read what value; do
  min[$what]=${min[$what]:-$value}
  max[$what]=${max[$what]:-$value}
  [ ${min[$what]} -gt ${value} ] && min[$what]=$value
  [ ${max[$what]} -lt ${value} ] && max[$what]=$value
  [ "${whats/:$what:/}" = "${whats}" ] && whats="$whats:$what:"
done
 
for x in ${whats//:/ }; do
  echo min\($x\):${min[$x]} max\($x\):${max[$x]}
done

$ /bin/bash abc.sh < abc.txt 
min(A):10 max(A):50
min(B):13 max(B):15
min(C):43 max(C):431

댓글 달기

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