2개 필드의 필터 기준에 따라 모든 레코드를 선택합니다.

2개 필드의 필터 기준에 따라 모든 레코드를 선택합니다.
ABC,1234.5333,5733.9374,5673.352,352,2.346374,-0.6686874
XYZ,5463.674,93773.683,5734.874,432,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764,-10.67484,5.74764

위의 csv 파일에서 마지막 두 필드[ABS(6번째 필드) 또는 ABS(7번째 필드)] 중 하나의 절대값이 >= 10인 모든 레코드를 선택하는 셸 스크립트를 작성해야 합니다.

결과적으로 내 출력은 다음과 같아야 합니다.

XYZ,5463.674,93773.683,5734.874,432,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764,-10.67484,5.74764

답변1

암시했듯이 awk를 사용하여 이를 달성할 수 있습니다. 절대값을 얻으려면 자신만의 함수를 정의해야 합니다. 따라서 다음과 같이 사용할 수 있습니다.

awk -F, 'function abs(a) {return a < 0 ? -a : a};(abs($6) >= 10 || abs($7) >= 10)' inputfile.txt 
XYZ,5463.674,93773.683,5734.874,432,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764,-10.67484,5.74764

답변2

다음과 같은 방법 으로 awk작업을 수행할 수 있습니다(내장 함수만 사용).

awk -F\, '{if (sqrt($(NF-1)*$(NF-1))>=10 || sqrt($NF*$NF)>=10 ) { print $0}}'  input_file

답변3

csvmodule 또는 from 을 python사용하는 등 데이터 및 필터 행을 구문 분석할 수 있는 도구를 사용합니다 .csvcsvsqlcsvkit

csvsql -H --query 'select * from file where abs(f) > 10 or abs(g) > 10' file | sed 1d

sed( 출력 헤더 행을 제거 하기 위해 파이프했습니다 ).

산출:

XYZ,5463.674,93773.683,5734.874,432.0,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564.0,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764.0,-10.67484,5.74764

답변4

Miller( mlr) 및 해당 filter하위 명령을 사용하여 크기가 10 이상인 두 번째 필드 또는 마지막 필드가 있는 헤더 없는 CSV 파일에서 모든 레코드를 필터링(추출)합니다.

$ mlr --csv -N filter 'abs($[NF-1]) >= 10 || abs($[NF]) >= 10' file
XYZ,5463.674,93773.683,5734.874,432,-5.683423,-10.38393
AES,7436874.5743,937.6843,8464.5634,564,6.35739,10.6834
PQR,784945.464,57484.8647,57484.453,5764,-10.67484,5.74764

표시된 대로 awk현재 NF레코드의 필드 수입니다. 를 사용하면 $[NF]마지막 필드의 값을 얻을 수 있고 while은 $[NF-1]끝에서 두 번째 필드의 값을 얻을 수 있습니다.

데이터에 헤더가 있는 경우 해당 -N옵션을 제거하고 대신 필드 이름을 사용할 수 있습니다 $[NF].

mlr --csv filter 'abs($fieldA) >= 10 || abs($fieldB) >= 10' file

관련 정보