한 줄의 데이터가 새 줄 구분 기호를 사용하여 여러 줄로 분할되는 큰 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
나는 알고 싶다,
- 다른 행에 대한 탭 수를 얻을 수 있는 경우
- 탭 수를 추가하여 총 995개를 얻습니다.
- 합계에 도달하면 이 행에서 추가된 탭 개수를 하나의 행으로 연결해야 합니다.
쉘 스크립트를 사용하여 이것이 달성될 수 있는지 알려주십시오.
감사해요. !
답변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=996
996개의 대시와 함께 tr
+ 명령을 입력할 수 있습니다 paste
.
답변2
필드 수에 도달할 때까지 행을 계속 읽는 것이 도움이 됩니까? 다른 기사에서:
awk -F'\t' '
{while (NF<996) {getline X
$0 = $0 FS X
}
}
1
' file