다음 형식의 텍스트 파일이 있습니다.
$DATA1 소스='HSPICE' 버전='I-2013.12-SP2-1 32비트' .TITLE "CMOS 인버터 전송 특성" 인덱스 t_r t_ft t_rf t_fr t_rr t_ff 성격변화# 1 1.361e-11 1.177e-11 8.807e-12 9.063e-12 2.002e-08 2.002e-08 2.500e+01 1 2 1.339e-11 1.178e-11 8.805e-12 8.867e-12 2.002e-08 2.002e-08 2.500e+01 1 3 1.334e-11 1.177e-11 8.811e-12 8.824e-12 2.002e-08 2.002e-08 2.500e+01 1 . . . 1000 1.339e-11 1.178e-11 8.805e-12 8.867e-12 2.002e-08 2.002e-08 2.500e+01 1
처음 5개 행을 삭제하고 3개 행 세트에서 9개 값을 추출하고 싶습니다. 이 모든 값은 awk 명령을 사용하여 9개의 다른 출력 파일에 배치됩니다.
출력 파일의 예는 다음과 같습니다.-
File1.txt
1 2 삼 . . 1000
파일 2.txt
1.361e-11 1.339e-11 1.334e-11 . . . 1.339e-11
3행 세트의 9개 요소 모두 동일합니다.
답변1
순수한 awk
솔루션은 다음과 같습니다.
awk '
NR<=5 { next }
{ for(i=1; i<=NF; i++) print $i > "File"++c}
NF==2 { c=0 }
'
다섯 개의 헤더 줄을 건너뛰고 파일에 남아 있는 데이터가 있는 필드를 인쇄합니다. 해당 이름은 두 개의 필드만 있는 줄에서 재설정되는 카운터에 의해 정의됩니다.
답변2
bare 로도 가능 awk
하지만 제가 가장 먼저 생각한 것은 sed
+ awk
조합이었습니다.
sed '1,5d;s/^\([[:digit:]]\)/\n\1/' file |
awk 'BEGIN{RS="\n\n"}{for(i=1;i<=NF;i++){print $i > "file"i".txt"}}'
요점은 sed
다음에서 시작하는 모든 줄에 새 줄을 추가(사용)하는 것 입니다.숫자를 선택한 다음 에서 레코드 구분 기호를 다시 정의합니다 awk
.
답변3
또 다른 장점은 다음과 같습니다 sed
.tr
printf
tr -s '[:space:]' \\n <infile |
sed "/^[0-9]/,${$(
printf '\nw file%b\nn' \
1 2 3 4 5 6 7 8 '9\n}\c'
)"
클립보드에서 실행하고, 예제를 버퍼에 복사한 후 출력을 파이프 하고 xsel
.../tmp
head -n3 /tmp/file?
...인쇄...
==> /tmp/file1 <==
1
2
3
==> /tmp/file2 <==
1.361e-11
1.339e-11
1.334e-11
==> /tmp/file3 <==
1.177e-11
1.178e-11
1.177e-11
==> /tmp/file4 <==
8.807e-12
8.805e-12
8.811e-12
==> /tmp/file5 <==
9.063e-12
8.867e-12
8.824e-12
==> /tmp/file6 <==
2.002e-08
2.002e-08
2.002e-08
==> /tmp/file7 <==
2.002e-08
2.002e-08
2.002e-08
==> /tmp/file8 <==
2.500e+01
2.500e+01
2.500e+01
==> /tmp/file9 <==
1
1
1