10,671개의 열이 있는 파일이 있습니다.
모든 열이 인쇄될 때까지 file_transpose01, file_transpose02, ... file_transpose10이라는 이름의 1000개의 열이 있는 10개의 작은 파일로 분할하려고 합니다. 파일의 첫 번째 열을 각각의 새 하위 파일의 첫 번째 열로 인쇄하고 있습니다.
난 그게 가능하다는 걸 알아줄 번호로 awk 사용.
NR 대신 NF를 사용하여 열로 분할하도록 이 방법을 적용하려고 합니다.
awk 'BEGIN{$1;}NF%1000==2{x="masterfile_transposed"++i;a[i]=x;print f>x;}{print > x}' masterfile
하지만 오류가 발생합니다.
expression for `>' redirection has null string value. I am not sure what is wrong with my syntax. Is it possible to do this task using awk?
이 접근 방식을 어떻게 작동하게 만들 수 있습니까? 아니면 더 나은 접근 방식이 있습니까?
답변1
awk -v ncols=1000 '
{
f=1
file = "file_" f
for (i=1; i <= NF; i++) {
printf "%s%s", $i, OFS > file
if (i % ncols == 0) {
print "" > file
f++
file = "file_" f
}
}
print "" > file
}
' file
답변2
이 열을 무엇으로 구분하는지 모르겠지만 다음과 같은 파일을 만들었습니다.
i=0
until [ "$((i+=1))" -gt 100 ]
do seq -s ' ' 10671
done >/tmp/file
결과는 100개의 행과 10671개의 열이며 각각은 일련의 공백으로 구분됩니다.
다음에 내가 한 일은:
sed 's/ */\n/1000;/\n/P;//D;G' </tmp/file | sed 's/.* //'
sed
데이터가 분할되는 위치를 명확하게 확인하고 싶기 때문에 두 번째 것을 사용하고 있습니다 . 단일 행에 있는 수천 개의 열을 이해하는 것은 약간 어려울 수 있습니다. 그래서 마지막 열까지 각 행을 삭제합니다. 여기를 사용할 때마다 s/.* //
행의 마지막 열만 표시하고 싶기 때문입니다. 예를 들어, 처음 실행하면 인쇄됩니다...
1000 2000 3000 4000 5000 6000 7000 8000 9000 10000 10671
...100번. 이는 각 라인이 실제로 다음과 같이 보인다는 것을 의미합니다.
1 2 3...1000
1001 1002 1003...2000
...등. sed
확실히 데이터를 올바르게 분할했습니다 ...
그래서 나는 그것을 한 줄씩 별도의 파일로 나누는 것이 꽤 쉬울 것이라고 생각했습니다. 그래서 나의 다음 단계는 다음과 같습니다.
sed 's/ */\n/1000;/\n/P;//D;G' </tmp/file |
sed -n "$(printf 'w /tmp/outfile.%d\nn\n' {1..11})"
/tmp
... 모든 열이 개별적으로 분할된 11개의 파일이 생겼습니다 . 저 할 수 있어요...
sed 's/.* //' /tmp/outfile.1
...인쇄됩니다...
1000
1000
1000
1000
...25번. 또는...
sed 's/.* //' /tmp/outfile.11
...그리고...
10671
10671
10671
10671
...25번 더...