여러 파일로 분할해야 하는 대용량 파일이 있습니다.
사용하고 split
있는데 효과가 좋아요
file=home/sap/dim/deltafile.D2017313.T100058932IDL.gz
gunzip -c ${file} | split -l 10000000 -d -a 4 - ${file%/*}/"working".$v_procid.`basename ${file%.*}`.part.
awk
그것은 또한 그것 과 함께 작동합니다. 하지만 변수를 전달하면 awk
실패합니다.
gunzip -c ${file} | awk 'NR%10000000==1 {x="F" ++i} {print > x}'
awk
F1
, F2
... 이라는 파일을 만듭니다 .
변수를 사용해야 하는데 다양한 예제를 모두 시도했습니다. 불운.
답변1
awk
를 사용하여 데이터를 전달할 수 있으며 -v var=value
, -v 옵션은 원하는 수만큼 존재할 수 있습니다.
awk -v foo=FOO 'END {print foo}' </dev/null
awk -v foo=FOO -v bar=BAR 'END {print foo, bar}' </dev/null
평소와 같이 할당의 일부로 쉘 변수 등을 사용할 수도 있습니다.
awk -v bar="$PWD" 'END {print bar}' </dev/null
file=home/sap/dim/deltafile.D2017313.T100058932IDL.gz
awk -v bar="${file%/*}" 'END {print bar}' </dev/null
답변2
파일 이름의 정적 부분을 외부적으로 구성하여 변수 awk
에 전달합니다 .awk
prefix="${file%/*}/working.$v_procid.$(basename ${file%.*}).part"
gunzip -c "$file" |
awk -v p="$prefix" 'NR % 10000000 == 1 { f = p "" ++i } { print >f }'
이 f = p "" ++i
비트는 로 대체될 수 있습니다 f = sprintf("%s%s", p, ++i)
.
많은 수의 출력 파일을 생성하려는 경우 close()
이전 출력 파일에 쓰기 전에 명시적으로 표시하여 실수로 사용 가능한 파일 설명자가 부족해지는 것을 방지할 수 있습니다.
awk -v p="$prefix" 'NR % 10000000 == 1 { if (f) close(f); f = p "" ++i } { print >f }'
답변3
처음 두 답변에 추가해야 할 것이 하나 더 있습니다. 변수를 전달하는 두 번째 방법은 프로그램을 지정한 후 명령줄에 변수를 추가하는 것입니다.
awk program.awk /path/to/input var=value second/input
~에서GNU Awk 매뉴얼
파일 이름 인수와 변수 할당 인수의 차이는 awk가 다음 입력 파일을 열려고 할 때 발생합니다. 실행 중에 파일 이름을 확인하여 실제로 변수 할당인지 확인합니다. 그렇다면 awk는 파일을 읽는 대신 변수를 설정합니다.
따라서 이전에 지정한 모든 파일을 읽은 후 변수는 실제로 주어진 값을 받습니다. 특히, 이러한 방식으로 할당된 변수 값은 awk가 매개변수 목록 스캔을 시작하기 전에 이러한 규칙이 실행되기 때문에 BEGIN 규칙(BEGIN/END 참조) 내에서 사용할 수 없습니다.
그래서 비록
awk -v var=value program.awk
BEGIN 섹션 이전에 프로그램 시작 부분에 값을 전달할 수 있으며 필요한 경우 언제든지 프로그램 변수를 변경할 수도 있습니다.