awk를 사용하여 현재 줄과 이전 줄 필드에 대한 간단한 수학 연산 결과를 기반으로 문자열을 인쇄하거나 생략합니다.

awk를 사용하여 현재 줄과 이전 줄 필드에 대한 간단한 수학 연산 결과를 기반으로 문자열을 인쇄하거나 생략합니다.
1529.89 1.05    22.36   48.78   33.8
1529.91 2.05    22.36   52.79   36.93
1529.92 3.06    22.36   52.80   36.93
1529.92 4.25    22.36   52.79   36.94
1529.92 5.10    22.36   52.79   36.94
1529.93 5.24    22.36   52.80   36.94
1529.94 6.05    22.36   52.80   36.94
1529.95 6.27    22.36   52.80   36.94
1529.95 7.01    22.36   52.80   36.94
1529.96 7.26    22.36   52.80   36.94
1529.97 8.11    22.36   52.80   36.94
1529.99 9.22    22.35   52.80   36.94
1530.00 10.12   22.36   52.80   36.94
1530.02 11.26   22.36   52.80   36.94
1530.03 12.18   22.36   52.80   36.94
1530.04 13.12   22.36   52.81   36.94
1530.06 14.04   22.36   52.81   36.95
1530.10 16.21   22.36   52.81   36.94
1530.11 17.17   22.35   52.80   36.94
1530.12 18.09   22.35   52.81   36.94
1530.14 19.19   22.35   52.81   36.94
1530.15 20.19   22.35   52.80   36.94
1530.17 21.24   22.35   52.81   36.94
1530.18 22.05   22.35   52.81   36.95
1530.20 23.14   22.35   52.81   36.95
1530.21 24.14   22.35   52.81   36.94
1530.23 25.23   22.35   52.80   36.94
1530.23 26.03   22.35   52.80   36.94
1530.23 26.24   22.34   52.80   36.94
1530.26 27.10   22.35   52.81   36.95

이런 종류의 파일이 있습니다. 내가 필요한 것은 두 번째 필드의 정수가 이전 줄의 두 번째 필드에 있는 동일한 숫자와 같지 않은 경우 각 줄을 인쇄하는 것입니다. 예를 들어 다음 두 줄은 다음과 같습니다.

1529.94 6.05    22.36   52.80   36.94
1529.95 6.27    22.36   52.80   36.94

...첫 번째 줄만 인쇄하고 두 번째 줄은 건너뛰고 싶습니다. 두 번째 필드 번호는 약 1300으로 증가한 다음 1로 감소합니다.

awk substr() 함수를 사용해 보았지만 계속해서 작동하지 않는 것 같습니다.

awk -F. '{for (i=NR;i<3814;i++) {i=1 n=(substr($2,4))}{i=i+1 v=(substr($2,4))} {if ((n+v)%2=1) print $0} {i++}}' test.csv

답변1

죄송합니다. 귀하의 awk답변은 전혀 도움이 되지 않습니다. 귀하가 표현한 요구 사항과 완전히 다릅니다.

  • 필드 구분 기호는 "."이 아니라 공백일 수 있습니다.
  • 필요하지 않은 십진수 구문 분석substr()
  • 소수를 정수로 반올림하려면,int()

따라서 코드는 다음과 같습니다.

awk 'int($2)!=prev{
  print
  prev=int($2)
}'

한 줄로 만들려면 ";"이 필요합니다.

awk 'int($2)!=prev{print;prev=int($2)}'

결과 :

1529.89 1.05    22.36   48.78   33.8
1529.91 2.05    22.36   52.79   36.93  
1529.92 3.06    22.36   52.80   36.93
1529.92 4.25    22.36   52.79   36.94
1529.92 5.10    22.36   52.79   36.94
1529.94 6.05    22.36   52.80   36.94
1529.95 7.01    22.36   52.80   36.94
1529.97 8.11    22.36   52.80   36.94
1529.99 9.22    22.35   52.80   36.94
1530.00 10.12   22.36   52.80   36.94
1530.02 11.26   22.36   52.80   36.94
1530.03 12.18   22.36   52.80   36.94
1530.04 13.12   22.36   52.81   36.94
1530.06 14.04   22.36   52.81   36.95
1530.10 16.21   22.36   52.81   36.94
1530.11 17.17   22.35   52.80   36.94
1530.12 18.09   22.35   52.81   36.94
1530.14 19.19   22.35   52.81   36.94
1530.15 20.19   22.35   52.80   36.94
1530.17 21.24   22.35   52.81   36.94
1530.18 22.05   22.35   52.81   36.95
1530.20 23.14   22.35   52.81   36.95
1530.21 24.14   22.35   52.81   36.94
1530.23 25.23   22.35   52.80   36.94
1530.23 26.03   22.35   52.80   36.94
1530.26 27.10   22.35   52.81   36.95

옳은?

답변2

사용해도 괜찮다면 다음을 사용하세요 sed.

sed -E '1p;N;/^[^ ]+ +([0-9]+)\..*\n[^ ]+ +\1\./D;h;s/.*\n//p;x;$d;D' test.csv

N;P;D모드를 사용하면 항상 두 행을 동시에 처리할 수 있습니다. 긴 정규식은 두 번째 필드에서 동일한 정수를 가진 두 줄을 찾은 후 다음 줄로 계속하고, 그렇지 않으면 두 번째 줄을 인쇄하고 계속하는 것입니다. 더 자세한 설명은 요청 시 제공 가능합니다.

필드 구분 기호가 공백이 아닌 탭인 경우 패턴을 조정하면 됩니다.

답변3

사용행복하다(이전 Perl_6): 두 번째 예

raku -e 'my @a = lines.rotor(2 => -1); for @a {.[0].put if .words[1].Int != .words[6].Int};'    

또는

raku -e 'my @a = lines.rotor(2 => -1); for @a -> $a {$a.[0].say when $a.words[1].Int != $a.words[6].Int };' 

위의 Raku 코드는 OP 제목을 문자 그대로 해석한 것입니다. 선 쌍을 연결하고 rotor, 겹치는 부분을 만들고, 선 0,1쌍, 1,2쌍, 2,3쌍 등을 만드는 데 사용됩니다. @a한 쌍의 라인을 포함하는 배열의 각 위치 에 대해 Int두 번째 열의 Eger 동등성에 대한 조건부 테스트를 수행합니다. s가 같지 않으면 Int쌍을 이루는 행의 첫 번째 요소(행)는 out- 입니다 put.

이 접근 방식의 한 가지 주의 사항은 rotor기본적으로 완전히 "그룹화된" 요소만 반환된다는 것입니다. 따라서 모든 후행 "요소 클러스터"가 @a배열에서 제거됩니다. 질문 제목은"...현재 행과 이전 행의 필드 간의 간단한 수학적 계산...", 그러나 이 답변은 엄격한 페어링을 강제합니다(마지막 행은 페어링되지 않음). 이 답변이 어떤 경우에도 유용하길 바랍니다.

예제 출력:

1529.89 1.05    22.36   48.78   33.8
1529.91 2.05    22.36   52.79   36.93
1529.92 3.06    22.36   52.80   36.93
1529.92 4.25    22.36   52.79   36.94
1529.93 5.24    22.36   52.80   36.94
1529.95 6.27    22.36   52.80   36.94
1529.96 7.26    22.36   52.80   36.94
1529.97 8.11    22.36   52.80   36.94
1529.99 9.22    22.35   52.80   36.94
1530.00 10.12   22.36   52.80   36.94
1530.02 11.26   22.36   52.80   36.94
1530.03 12.18   22.36   52.80   36.94
1530.04 13.12   22.36   52.81   36.94
1530.06 14.04   22.36   52.81   36.95
1530.10 16.21   22.36   52.81   36.94
1530.11 17.17   22.35   52.80   36.94
1530.12 18.09   22.35   52.81   36.94
1530.14 19.19   22.35   52.81   36.94
1530.15 20.19   22.35   52.80   36.94
1530.17 21.24   22.35   52.81   36.94
1530.18 22.05   22.35   52.81   36.95
1530.20 23.14   22.35   52.81   36.95
1530.21 24.14   22.35   52.81   36.94
1530.23 25.23   22.35   52.80   36.94
1530.23 26.24   22.34   52.80   36.94

https://raku.org

답변4

사용행복하다(이전 Perl_6)

raku -e 'my @a = lines.map(*.words); my %seen; for @a[*].map(*.[1].Int) {   \
         %seen.=append: ( $_ => $++ ) }; for %seen.values.map(*.min).sort -> $a {  \
         @a[$a].join("\t").put };' 

또는

raku -e 'my @a = lines>>.words;  my @b = @a.map(*.[1].Int).pairs.unique( :as(*.value) ); \
         @b.=map(*.key); for @b -> $a {@a[$a].join("\t").put};'

즉, lines개별적으로 단어로 나누어 @a배열에 저장됩니다.

(위의 첫 번째 예): %seen해시가 선언되었습니다. 각 행의 두 번째 열의 경우 로 변환되고 Int각각은 굵은 화살표 구문을 사용하여 키/값 쌍이 됩니다 Int. 여기서 as 키와 0 인덱스 행 번호는 입니다. 이러한 키/값 쌍은 해시에 추가됩니다. 해시의 키는 고유해야 하므로 동일한 키에 여러 행 번호가 추가됩니다. 마지막으로 해시를 반복하고 행 번호를 추출한 후 이를 위치 인덱스로 사용하여 배열의 일치하는 행만 인쇄함으로써 데이터가 출력됩니다.=>Intvalue%seenIntput%seenvaluesmin$a@a[$a]@a

위의 두 번째 예: 각 행의 첫 번째 열은 로 변환되고 , 행 번호를 키와 값 으로 사용하여 Int추가로 로 변환됩니다 . 그런 다음 이를 기준으로 비교 됩니다 . 그런 다음 각 배열 요소로 배열을 개별적으로 덮어쓰면 행 번호가 복원됩니다 . 이러한 은 위에서 설명한 대로 행 배열을 인덱싱하는 데 사용됩니다.pairsIntpairsunique:as(*.value)@b@b.=map(*.key)keykey@a

예제 출력:

1529.89 1.05    22.36   48.78   33.8
1529.91 2.05    22.36   52.79   36.93
1529.92 3.06    22.36   52.80   36.93
1529.92 4.25    22.36   52.79   36.94
1529.92 5.10    22.36   52.79   36.94
1529.94 6.05    22.36   52.80   36.94
1529.95 7.01    22.36   52.80   36.94
1529.97 8.11    22.36   52.80   36.94
1529.99 9.22    22.35   52.80   36.94
1530.00 10.12   22.36   52.80   36.94
1530.02 11.26   22.36   52.80   36.94
1530.03 12.18   22.36   52.80   36.94
1530.04 13.12   22.36   52.81   36.94
1530.06 14.04   22.36   52.81   36.95
1530.10 16.21   22.36   52.81   36.94
1530.11 17.17   22.35   52.80   36.94
1530.12 18.09   22.35   52.81   36.94
1530.14 19.19   22.35   52.81   36.94
1530.15 20.19   22.35   52.80   36.94
1530.17 21.24   22.35   52.81   36.94
1530.18 22.05   22.35   52.81   36.95
1530.20 23.14   22.35   52.81   36.95
1530.21 24.14   22.35   52.81   36.94
1530.23 25.23   22.35   52.80   36.94
1530.23 26.03   22.35   52.80   36.94
1530.26 27.10   22.35   52.81   36.95

https://raku.org

관련 정보