Bash 스크립트에서 문자열 추출, 잘라내기 및 처리

Bash 스크립트에서 문자열 추출, 잘라내기 및 처리

기본적으로 다음과 같은 내용을 포함하는 4개의 txt 파일이 있습니다.

FILE 1

localhost_access_2018-07-19.tar.gz:13

localhost_access_2018-07-20.tar.gz:17

localhost_access_2018-07-21.tar.gz:12

localhost_access_2018-07-22.tar.gz:4

localhost_access_2018-07-23.tar.gz:2

localhost_access_2018-07-24.tar.gz:2905

localhost_access_2018-07-25.tar.gz:10440

localhost_access_2018-07-26.tar.gz:2644

localhost_access_2018-07-27.tar.gz:1896

localhost_access_2018-07-28.tar.gz:1238

localhost_access_2018-07-29.tar.gz:932


FILE 2

localhost_access_2018-06-19.tar.gz:0

localhost_access_2018-06-20.tar.gz:0

localhost_access_2018-06-21.tar.gz:1

localhost_access_2018-06-22.tar.gz:0

localhost_access_2018-06-23.tar.gz:0

localhost_access_2018-06-24.tar.gz:0

localhost_access_2018-06-25.tar.gz:0

localhost_access_2018-06-26.tar.gz:1

localhost_access_2018-06-27.tar.gz:0

localhost_access_2018-07-04.tar.gz:2

localhost_access_2018-07-05.tar.gz:3

localhost_access_2018-07-06.tar.gz:6

localhost_access_2018-07-07.tar.gz:0

localhost_access_2018-07-19.tar.gz:15

등.

4개 파일 각각에는 이 경우와 같이 중복된 날짜가 있지만 localhost_access_2018-07-19.tar.gz:15최종 숫자는 다릅니다(: 이후).

동일한 날짜에 대해 " "를 잘라내고 local_host_access_새 txt 파일의 날짜만 유지하고(값과 형식을 변경하지 않고) .tar.gz를 잘라야 합니다.

또한 동일한 날짜의 모든 값을 합산해야 합니다.

따라서 4개의 서로 다른 파일에 4개의 "localhost_access_2018-07-19" 날짜가 있는 경우 값 .gz:"XYZ" 뒤의 모든 숫자 XYZ를 합산해야 합니다.

예:

localhost_access_2018-07-19.tar.gz:1

localhost_access_2018-07-19.tar.gz:2

localhost_access_2018-07-19.tar.gz:3

localhost_access_2018-07-19.tar.gz:4

새 파일에서 단일 텍스트 출력으로 반환되어야 합니다.

2018-07-19:10

나는 넣었다나는 대답으로 노력한다, 하지만 더 나은 솔루션(및 설명)이 있기를 바랍니다. 감사해요.

답변1

또한 다음과 같은 간단한 awk방법을 시도해 보세요.

awk -F"[_.:]" '                                 # set field separator to "_", ".", or ":"
        {SUM[$3] += $NF                         # sum all trailing fields in array indexed by the date
        }
END     {for (s in SUM) print s, SUM[s]         # print the date and the respective sum
        }
' OFS=":" file[123]                             # set output field separator; have shell expand file names 1 - 3

답변2

awk -F 'localhost_access_' ' 
    {
         n=substr($2,1+index($2,":"));  
         gsub(".tar.gz.*","",$2);
         str[$2]+=n
    }
    END{
        for (i in str){
            print i":"str[i]
        }
    }' node1.txt node2.txt node3.txt node4.txt | sort -to > output.txt

    output_not_sorted=$(cat output.txt);

    # sort output by date

    exit

이 문제가 개선될 수 있는지 알려주세요.

답변3

질문 시작 부분에 표시된 두 파일을 고려하고 실제로 빈 줄이 포함되어 있지 않다고 가정합니다.

$ awk -F ':' -v OFS=':' '
    { sum[$1]+=$2 }
    END { for (key in sum) {
        split(key,f,"[_.]")
        print f[3],sum[key] } }' file* | sort
2018-06-19:0
2018-06-20:0
2018-06-21:1
2018-06-22:0
2018-06-23:0
2018-06-24:0
2018-06-25:0
2018-06-26:1
2018-06-27:0
2018-07-04:2
2018-07-05:3
2018-07-06:6
2018-07-07:0
2018-07-19:28
2018-07-20:17
2018-07-21:12
2018-07-22:4
2018-07-23:2
2018-07-24:2905
2018-07-25:10440
2018-07-26:2644
2018-07-27:1896
2018-07-28:1238
2018-07-29:932

파일 이름을 연관 배열의 키로 사용 sum하고 그 안의 각 파일 이름에 대한 합계를 수집합니다. 마지막으로 키를 반복 sum하고 각 키의 날짜 부분과 합계를 인쇄합니다. 키의 날짜 부분은 점과 밑줄로 나눈 후 세 번째 필드입니다.

결과는 파이프라인입니다 sort.


더 짧지만 기본적으로 위와 동일합니다(단, 날짜를 배열의 키로 사용하는 경우에만 sum):

awk -F '[_.:]' -v OFS=':' '
    { sum[$3]+=$6 }
    END { for (d in sum) print d, sum[d] }' file*

답변4

#!/bin/bash
# Sum duplicate row values with awk ; Columns 3 and 6
awk -F '[_.:]' '{seen[$3]+=$6}END{for (i in seen) print i, seen[i]}' OFS=":" node[1-4].txt | 

sort > log.txt

"# awk를 사용하여 중복 행 값 합계"의 소스 https://stackoverflow.com/questions/42024296/sum-duplicate-row-values-with-awk

관련 정보