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
답변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 인덱스 행 번호는 입니다. 이러한 키/값 쌍은 해시에 추가됩니다. 해시의 키는 고유해야 하므로 동일한 키에 여러 행 번호가 추가됩니다. 마지막으로 해시를 반복하고 행 번호를 추출한 후 이를 위치 인덱스로 사용하여 배열의 일치하는 행만 인쇄함으로써 데이터가 출력됩니다.=>
Int
value
%seen
Int
put
%seen
values
min
$a
@a[$a]
@a
위의 두 번째 예: 각 행의 첫 번째 열은 로 변환되고 , 행 번호를 키와 값 으로 사용하여 Int
추가로 로 변환됩니다 . 그런 다음 이를 기준으로 비교 됩니다 . 그런 다음 각 배열 요소로 배열을 개별적으로 덮어쓰면 행 번호가 복원됩니다 . 이러한 은 위에서 설명한 대로 행 배열을 인덱싱하는 데 사용됩니다.pairs
Int
pairs
unique
:as(*.value)
@b
@b.=map(*.key)
key
key
@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