여러 행의 데이터를 하나의 행으로 연결하는 Unix 스크립트

여러 행의 데이터를 하나의 행으로 연결하는 Unix 스크립트

한 줄의 데이터가 새 줄 구분 기호를 사용하여 여러 줄로 분할되는 큰 tsv 파일이 있습니다.

탭 수에 따라 이들을 결합해야 합니다.

예: 단일 행의 총 탭 수가 995라고 가정하면 데이터는 다음과 같이 분할됩니다.

Row Number  Tab Count
Row 1       660
Row 2       0
Row 3       300         
Row 5       20
Row 6       15
Total       995

참고: 위의 선 분할은 일관성이 없으며 다양합니다.

탭 수를 추가하고 총계가 995에 도달하면 여러 행의 데이터를 하나의 행으로 연결해야 합니다.

새 줄 구분 기호를 기준으로 줄을 연결하려면 다음 명령이 있습니다.

paste -sd '\n' inputfile > output file

나는 알고 싶다,

  1. 다른 행에 대한 탭 수를 얻을 수 있는 경우
  2. 탭 수를 추가하여 총 995개를 얻습니다.
  3. 합계에 도달하면 이 행에서 추가된 탭 개수를 하나의 행으로 연결해야 합니다.

쉘 스크립트를 사용하여 이것이 달성될 수 있는지 알려주십시오.

감사해요. !

답변1

이러한 유형의 문제와 마찬가지로 해당 프로세스에 후처리 단계를 추가하기보다는 데이터를 생성한 프로세스를 먼저 수정하는 것이 좋습니다. 그렇게 말하면 여기에 당신이 할 수 있는 일이 있습니다.

$ cat file
1       2
3
1       2       3
1
2
3
$ awk -v w=3 -f script.awk file
1       2       3
1       2       3
1       2       3

스크립트 awk는 미리 설정된 수의 필드가 수집될 때까지 입력에서 탭으로 구분된 필드를 수집합니다. 그런 다음 수집된 필드를 자체 행으로 출력하고 입력에서 계속 읽습니다.

출력의 필드 수는 w위에 표시된 대로 명령줄에 전달되는 값으로 제공됩니다. 수량이니 참고해주세요필드, 탭 수가 아닙니다.

BEGIN { OFS = FS = "\t" }

function output_line () {
    # a function that outputs the nf elements in the array a
    # separated by OFS (tab) and terminated by ORS (newline)

    for (j = 1; j < nf; ++j)
        printf("%s%s", a[j], OFS)

    printf("%s%s", a[nf], ORS)
}

{
    # a:  an array of fields that we want to output together
    # nf: the length of that array

    # just add each field to the a array
    for (i = 1; i <= NF; ++i) {
        a[++nf] = $i

        # if enough has been read, output the collected data
        if (nf == w) {
            output_line()
            nf = 0
        }
    }
}

END {
    # output any data remaining in a
    if (nf > 0)
        output_line()
}

이는 다음과 관련이 있습니다.

tr '\t' '\n' <file | paste - - -

나의 작은 예를 들어 보겠습니다. 귀하의 경우에는 awk위의 스크립트를 사용 하거나 -v w=996996개의 대시와 함께 tr+ 명령을 입력할 수 있습니다 paste.

답변2

필드 수에 도달할 때까지 행을 계속 읽는 것이 도움이 됩니까? 다른 기사에서:

awk -F'\t' '
        {while (NF<996) {getline X
                         $0 = $0 FS X
                        }
        }
1
' file

관련 정보