파이프라인에서 grep 출력을 행 형식에서 열 형식으로 변환

파이프라인에서 grep 출력을 행 형식에서 열 형식으로 변환

분석을 실행하기 위해 "dsk"라는 프로그램을 사용하고 있습니다. 나는 몇 줄의 분석에만 관심이 있으며 다음을 사용하여 해당 줄을 검색합니다.

dsk -file <filename> | grep -Ei 'string1|string2|string3'

이것은 나에게 다음과 같은 것을 제공합니다:

string1                                : 13
string2                                : 46
string3                                : 39

*편집: 보다 현실적인 출력을 위해 형식이 변경되었습니다(탭 제한 없음, 32개의 공백, 콜론 및 필드 사이의 또 다른 공백).

그러나 나는 출력이 다음과 같기를 원합니다.

string1 string2 string3
13      46      39

Glenn이 제공한 답변은 다음과 같은 결과를 생성합니다. 아마도 공백이 혼란을 야기하기 때문일 것입니다.

string1 string2 string3
:   :   :

답변1

사용바꾸다

dsk -file "$file" | awk '
    tolower($1) ~ /string1|string2|string3/ { n++; vars[n] = $1; vals[n] = $2 }
    END {
        for (i = 1; i <= n; i++) printf "%s\t", vars[i]
        print ""
        for (i = 1; i <= n; i++) printf "%s\t", vals[i]
        print ""
    }
'

답변2

@SteelDriver가 링크한 답변에 언급된 일반 도구는 @glenn jackman의 답변과 마찬가지로 완벽합니다.

그러나 데이터 형식이 지정한 것처럼 간단한 경우, 즉 조각에 공백이 없는 경우 string1 .. stringN입력 파일을 두 번 읽는 대신 다음을 수행할 수도 있습니다.

dsk -file <filename> | grep -Ei 'string1|string2|string3' > tempfile.txt

readarray labels < <(awk '{print $1}' tempfile.txt)
readarray values < <(awk '{print $2}' tempfile.txt)

printf '%s\t' ${labels[@]}
printf '\n'

printf '%s\t' ${values[@]}
printf '\n'

이 형식은 다소 단순할 수 있으며 특히 원하는 대로 항목을 정렬하지 않을 수 있습니다. 그러나 필요한 것이 탭으로 구분된 출력뿐이라면 그렇게 할 것입니다.

관련 정보