나는 500에서 500,000까지의 숫자를 포함하는 csv 파일을 가지고 있으며 일치 항목을 1로 바꾸고 일치하지 않는 항목을 해당 열의 공백으로 0으로 바꾸고 싶습니다.고정 길이 행렬, 예를 들어 다음이 있습니다.
12345,6457,789,21231,657
6457,21231,657
12345,789,21231
첫 번째 열에서 문자열 12345를 검색하면 두 번째 행을 오른쪽으로 밀고 일치하는 셀(행 1, 열 1 및 행 3, 열 1)을 1로 바꾸고 일치하지 않는 셀(행 2, 열 1)을 바꿉니다. )는 0과 쉼표로 대체됩니다. 아래를 참조하세요.
1,6457,789,21231,657
0,6457,21231,657
1,789,21231
이제 두 번째 열에서 다음 문자열(6457)을 검색할 때 위와 동일한 단계를 수행합니다. 즉, 일치하는 셀(행 1, 열 2 및 행 2, 열 2)을 1 및 일치하지 않는 셀(행 3)로 바꿉니다. , 2열) ) 세 번째 행을 0과 쉼표를 사용하여 오른쪽으로 밀어 넣습니다. 아래를 참조하세요.
1,1,789,21231,657
0,1,21231,657
1,0,789,21231
그리고 다음과 같이 원하는 결과를 얻을 때까지 계속합니다.
1,1,1,1,1
0,1,0,1,1
1,0,1,1,0,
아래는 샘플 파일 링크입니다.
감사해요
답변1
이 Perl 스크립트는 원하는 작업을 수행합니다.
#!/usr/bin/perl
## Read the file's lines into the @lines aray.
my @lines = <>;
## read the values from the first line and save them as @values
my @values = split(/,/, $lines[0]);
## Iterate over the values. $#values is the number of elements
## in the array.
for my $i (0..$#values){
## Remove trailing newlines and save this value as $value
chomp(my $value = $values[$i]);
## Iterate over each line
for my $k (0..$#lines ) {
## remove trailing newlines.
chomp($lines[$k]);
## Get this line's values
my @lineValues = split(/,/, $lines[$k]);
## If the value at position $i on this line is the same
## as the value at position $i of the first line.
if ($lineValues[$i] == $value) {
## Set this value to 1
$lineValues[$i] = 1
}
## If they are not equal
else {
## Prepend '0,' to this line's value
$lineValues[$i] = '0,' . $lineValues[$i];
}
## Save the modified line back in the @lines array
$lines[$k] = join ',', @lineValues;
}
}
## Print the final output
print join "\n", @lines;
print "\n";
다른 이름으로 저장 foo.pl
하고 다음과 같이 실행합니다(질문의 샘플 파일에서 실행하는 경우 출력 표시).
$ perl foo.pl foo.csv
1,1,1,1,1
0,1,0,1,1
1,0,1,1,0,
링크한 파일에서:
$ perl foo.pl file.csv
1,1,1,1,1,1
1,0,1,0,1,1
0,1,0,1,1,1
0,0,1,1,1,1
0,1,1,1,1,1
1,1,1,0,0,1
0,1,1,1,0,1