development

잘라 내기 명령을 사용하여 여러 열 제거

big-blog 2020. 12. 4. 19:43
반응형

잘라 내기 명령을 사용하여 여러 열 제거


주어진 입력

 에코 1,2,3,4,5,6,7,8,9, ... 100 

열 5를 자르고 싶다면 할 수 있습니다

컷 -d, -f-4,6-

5, 7 등과 같이 연속되지 않은 여러 열을 자르려면 어떻게해야합니까? 하나의 라이너가 있습니까?


기존 -f사양 에서 직접 시퀀스를 계속할 수 있어야합니다 .

5와 7을 모두 건너 뛰려면 다음을 시도하십시오.

cut -d, -f-4,6-6,8-

단일 순차 열을 건너 뛰기 때문에 다음과 같이 작성할 수도 있습니다.

cut -d, -f-4,6,8-

계속 진행하려면 5, 7, 11을 건너 뛰려면 다음을 사용합니다.

cut -d, -f-4,6-6,8-10,12-

보다 명확한 관점으로 나타내려면 시퀀스 목록의 시작 / 끝에 각각 이동하는 시작 / 종료 열을 사용할 때 시각화하는 것이 더 쉽습니다. 예를 들어 다음은 열 5와 11을 건너 뛰고 열 2에서 20까지 인쇄합니다.

cut -d, -f2-4,6-10,12-20

따라서 "2-4", 5 개, "6-10", 11 개, "12-20"이 인쇄됩니다.


제외 할 필드를 생각하는 것이 더 쉽습니다.

잘리지 않는 필드 (출력에 유지되지 않음)의 수가 적 으면 --complement플래그 를 사용하는 것이 더 쉬울 수 있습니다 . 예를 들어 3, 7, 12를 제외한 모든 필드 1-20을 포함하려면 다음과 같이하십시오.

cut -d, --complement -f3,7,12 <inputfile

보다는

cut -d, -f-2,4-6,8-11,13-

seq를 사용하여 모든 홀수 / 짝수 열을자를 수 있습니다.

이것은 모든 홀수 열을 인쇄합니다

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 1 2 10)

사용할 수있는 모든 짝수 열을 인쇄하려면

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(seq -s, 2 2 10)

두 번째 seq 수를 변경하여 인쇄 할 열을 지정할 수 있습니다.

인쇄 할 열 사양이 더 복잡한 경우 다음과 같은 "one-liner-if-clause"를 사용할 수도 있습니다.

echo 1,2,3,4,5,6,7,8,9,10 | cut -d, -f$(for i in $(seq 1 10); do if [[ $i -lt 10 && $i -lt 5 ]];then echo -n $i,; else echo -n $i;fi;done)

이렇게하면 1에서 5까지의 모든 열이 인쇄됩니다. 조건을 수정하여 열이 인쇄 될 날씨를 지정하는 더 복잡한 조건을 만들 수 있습니다.


Perl에서도 동일한 작업을 수행 할 수 있습니다.
1부터 시작하는 인덱싱 대신 0부터 시작하는 인덱싱을 사용하므로 필드 값이 1만큼 오프셋됩니다.

perl -F, -lane 'print join ",", @F[1..3,5..9,11..19]'    

다음과 같습니다.

cut -d, -f2-4,6-10,12-20

출력에 쉼표가 필요하지 않은 경우 :

perl -F, -lane 'print "@F[1..3,5..9,11..19]"'

참고 URL : https://stackoverflow.com/questions/13690461/using-cut-command-to-remove-multiple-columns

반응형