![공통 키워드를 기반으로 데이터를 형식으로 구문 분석합니다.](https://linux55.com/image/154214/%EA%B3%B5%ED%86%B5%20%ED%82%A4%EC%9B%8C%EB%93%9C%EB%A5%BC%20%EA%B8%B0%EB%B0%98%EC%9C%BC%EB%A1%9C%20%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%A5%BC%20%ED%98%95%EC%8B%9D%EC%9C%BC%EB%A1%9C%20%EA%B5%AC%EB%AC%B8%20%EB%B6%84%EC%84%9D%ED%95%A9%EB%8B%88%EB%8B%A4..png)
.mp4xyz로 끝나는 긴 파일 이름 목록이 있습니다.
12334,dogimage.mp4001
12335,dogimage.mp4002
12336,dogimage.mp4003
12347,cats.mp4001
12348,cats.mp4002
동일한 이름을 공유하는 모든 이미지를 결합하여 출력을 이 형식으로 변환해야 합니다. 이 예에서는 dogimage.mp4
and 만 사용하고 있지만 cats.mp4
수천 개의 키워드가 있을 것입니다.
a:3:{i:0;s:4:"12334";i:1;s:4:"12335";i:2;s:4:"12336";}
a:2:{i:0;s:4:"12347";i:1;s:4:"12348";}
다음 문자열은 다음을 나타냅니다.
a:3
& a:2
= 총 사진 수
i:0
= 이 키워드의 이미지 수
답변1
멍청하게:
BEGIN{
# split by , or .mp4
FS=",|\\.mp4"
# sort array by numeric value
PROCINFO["sorted_in"] = "@val_num_asc"
}
# store count in a, store others as key, value pair in d[keyword]
{ a[$2]++; d[$2][$3]= $1 }
END{
for( keyword in d ){
printf( "a:%d:{", a[keyword] )
for( i in d[keyword] )
printf( "i:%d;s:4:\"%d\";", i-1, d[keyword][i] )
printf( "}\n" )
}
}
고쳐 쓰다
키워드 순서를 유지하려면:
BEGIN {
# split by , or .mp4
FS=",|\\.mp4"
# sort array by numeric value
PROCINFO["sorted_in"] = "@val_num_asc"
}
{
# insert next ordered number into loop_order upon new keyword
if(!($2 in d))
loop_order[k++] = $2
# store count in a, store others as key, value pair in d[$2]
a[$2]++; d[$2][$3]= $1
}
END{
for (j = 0; j < length(loop_order); ++j) {
keyword = loop_order[j]
printf( "a:%d:{", a[keyword] )
for( i in d[keyword] )
printf( "i:%d;s:4:\"%d\";", i-1, d[keyword][i] )
printf( "}\n" )
}
}
답변2
출력 형식입니다PHPserialize()
, 그래서:
php -r '
while ($line = fgets(STDIN)) {
$n = strtok($line, ",");
$image = strtok(".\n");
$a[$image][] = $n;
}
foreach ($a as $v) echo serialize($v) . "\n";' < file.list
귀하의 의견을 바탕으로 다음 사항이 주어졌습니다.
a:3:{i:0;s:5:"12334";i:1;s:5:"12335";i:2;s:5:"12336";}
a:2:{i:0;s:5:"12347";i:1;s:5:"12348";}
( 이 문자열의 길이는 5바이트 s:5
도 아니고 s:4
4바이트도 아닙니다.)
키워드(어휘)를 기반으로 배열 목록을 정렬하려면 루프 ksort($a);
앞에 를 삽입하세요 foreach
. 그러면 for 배열은 어휘적으로 배열 앞에 오기 때문에 cats
for 배열 앞에 나타납니다 .dogimage
cats
dogimage
또는 다음과 같이 어떤 배열이 어떤 키에 해당하는지에 대한 정보를 잃지 않도록 전체 연관 배열을 직렬화할 수도 있습니다.
php -r '
while ($line = fgets(STDIN)) {
$n = strtok($line, ",");
$image = strtok(".\n");
$a[$image][] = $n;
}
echo serialize($a) . "\n";' < file.list
이것은 만든다:
a:2:{s:8:"dogimage";a:3:{i:0;s:5:"12334";i:1;s:5:"12335";i:2;s:5:"12336";}s:4:"cats";a:2:{i:0;s:5:"12347";i:1;s:5:"12348";}}
답변3
Perl에서 해시 해시를 사용하는 한 가지 방법은 다음과 같습니다.
perl -F, -lne '
($k,$i) = split(/\.mp4/, $F[1]);
$s{$k}->{$i-1} = $F[0]
}{
foreach $k (keys %s) {
$hr = $s{$k};
printf "a:%d:{", keys %$hr;
foreach $i (sort {$a <=> $b} keys %$hr) {
printf "i:%d;s:4:\"%s\";", $i, $hr->{$i};
}
printf "}\n";
}
' file
a:1:{i:0;s:4:"12334";i:1;s:4:"12335";i:2;s:4:"12336";}
a:0:{i:0;s:4:"12347";i:1;s:4:"12348";}
"외부" 해시는 %s
키로 입력되는 반면, 내부 익명 해시는 접미사의 숫자 값(1 빼기)으로 입력되며 행의 첫 번째 쉼표로 구분된 필드에서 가져온 값을 갖습니다.
외부 해시는 순서가 지정되지 않으므로 출력 행의 순서가 보장되지 않습니다.