일치하는 행과 일치하지 않는 행의 열을 찾아 문자로 바꿉니다.

일치하는 행과 일치하지 않는 행의 열을 찾아 문자로 바꿉니다.

나는 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,

아래는 샘플 파일 링크입니다.

https://pastebin.com/AmbHYC9T

감사해요

답변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

관련 정보