다음 형식의 파일이 있습니다.
19-08-02 Name appel ok hope local merge (mk)
juin nov sept oct
00:00:t1 T1 299 0 24 8 3 64
F2 119 0 11 8 3 62
I1 25 0 2 9 4 64
F3 105 0 10 7 3 61
Regulated F2 0 0 0
FR T1 104 0 10 7 3 61
00:00:t2 T1 649 0 24 8 3 64
F2 119 0 11 8 3 62
I1 225 0 2 9 4 64
F3 165 0 10 7 3 61
Regulated F2 5 0 0
FR T1 102 0 10 7 3 61
20-08-02 Name appel ok hope local merge (mk)
juin nov sept oct
00:00:t5 T1 800 0 24 8 3 64
F2 111 0 11 8 3 62
I1 250 0 2 9 4 64
F3 105 0 10 7 3 61
Regulated F2 0 0 0
FR T1 100 0 10 7 3 61
CSV file
일부 데이터를 추출하여 다음 형식으로 다른 파일 에 쓰고 싶습니다 .
T1 F2 I1 F3 Regulated F2 FR T1
00:00:t1 299 119 25 105 0 104
00:00:t2 649 119 225 165 5 102
00:00:t5 800 111 250 105 0 100
.......
appel
00:00:XX
을 사용하려고 할 때마다 세 번째 필드의 값을 추출 하면 되지만 awk
특히 다섯 번째 필드가 두 단어로 구성되어 있기 때문에 스크립트를 올바르게 가져오는 데 성공하지 못했습니다 Regulated F2
. 개별 단어로 추출하는 방법을 모르겠습니다.
도와주세요!
답변1
펄 사용:
perl -lane 'BEGIN{ print("\t\tT1\tF2\tI1\tF3\tRegulated F2\tFR T1"); $, = "\t" } if($F[0] =~ /00:00:t[0-9]+/){ @f[0] = $F[0]; @f[1] = $F[2]; for($i = 2; $i < 7; $i++) { $_ = <>; @F=split(); if($i < 5){ $f[$i] = $F[1] }else{ $f[$i] = $F[2] } } print(@f) }' file
확장 스크립트(실행 파일 사용 chmod +x script.pl
및 run 사용 ./script.pl file
):
#!/usr/bin/perl -lan
BEGIN {
print("\t\tT1\tF2\tI1\tF3\tRegulated F2\tFR T1");
$, = "\t"
}
if($F[0] =~ /00:00:t[0-9]+/) {
$f[0] = $F[0];
$f[1] = $F[2];
for($i = 2; $i < 7; $i++) {
$_ = <>;
@F=split();
if($i < 5) {
$f[$i] = $F[1]
}
else {
$f[$i] = $F[2]
}
}
print(@f)
}
헤더를 수정하여 조정할 수 print("\t\tT1\tF2\tI1\tF3\tRegulated F2\tFR T1");
있으며 출력 필드 구분 기호를 수정하여 조정할 수 있습니다 $, = "\t"
.
% cat file
19-08-02 Name appel ok hope local merge (mk)
juin nov sept oct
00:00:t1 T1 299 0 24 8 3 64
F2 119 0 11 8 3 62
I1 25 0 2 9 4 64
F3 105 0 10 7 3 61
Regulated F2 0 0 0
FR T1 104 0 10 7 3 61
00:00:t2 T1 649 0 24 8 3 64
F2 119 0 11 8 3 62
I1 225 0 2 9 4 64
F3 165 0 10 7 3 61
Regulated F2 5 0 0
FR T1 102 0 10 7 3 61
20-08-02 Name appel ok hope local merge (mk)
juin nov sept oct
00:00:t5 T1 800 0 24 8 3 64
F2 111 0 11 8 3 62
I1 250 0 2 9 4 64
F3 105 0 10 7 3 61
Regulated F2 0 0 0
FR T1 100 0 10 7 3 61
% perl -lane 'BEGIN{ print("\t\tT1\tF2\tI1\tF3\tRegulated F2\tFR T1"); $, = "\t" } if($F[0] =~ /00:00:t[0-9]+/){ @f[0] = $F[0]; @f[1] = $F[2]; for($i = 2; $i < 7; $i++) { $_ = <>; @F=split(); if($i < 5){ $f[$i] = $F[1] }else{ $f[$i] = $F[2] } } print(@f) }' file
T1 F2 I1 F3 Regulated F2 FR T1
00:00:t1 299 119 25 105 0 104
00:00:t2 649 119 225 165 5 102
00:00:t5 800 111 250 105 0 100
%
답변2
작업은 매우 간단합니다. 날짜로 시작하거나 월 열을 포함하는 행을 무시합니다. 첫 번째 행에 테스트 시간이 포함되어 있으면 해당 시간과 다른 모든 행에 대해 세 번째 열을 가져옵니다. 아래 스크립트가 AWK
바로 그 일을 합니다.
데모:
$> ./data2cvs.awk testData.txt
T1,F2,I1,F3,Regulated F2,FR T1
00:00:t1,299,119,25,105,0,104
00:00:t2,649,119,225,165,5,102
00:00:t5,800,111,250,105,0,100
스크립트 소스
#!/usr/bin/awk -f
BEGIN {
HEADER="T1,F2,I1,F3,Regulated F2,FR T1"; print HEADER
}
# Ignore lines containing date and month
$1~/^[[:digit:]]{2}-.+/ || $0~/juin.*nov.*sept.*oct/ {
next ;
}
# Grab test time and first data value
# Essentially doing something like sprintf in C
# to a string of arrays
$1~/^[[:digit:]]{2}:.+/{
count++
DATA[count]=$1","$3
}
# grab remaining data values
$1 !~ /^[[:digit:]]{2}:.+/{
if ($1~/Regulated/ || $1~/FR/){
DATA[count]=DATA[count]","$3
}
else {
DATA[count]=DATA[count]","$2 ;
}
}
# print gathered data to STDIN
END{
for (i=1;i<=count;i++) print DATA[i]
}