나는 이것이 간단한 질문이라는 것을 알고 있으며 이전에 여러 분야에서 답변을 받았지만 awk, sed, grep 등을 사용할 때마다 원하는 열을 선택하고 인쇄하는 것을 보았습니다. 원하는 열의 개수를 알 수 없고 특정 열을 원하지 않는 경우 원하지 않는 열을 어떻게 삭제합니까?
원하지 않는 열 앞의 열을 선택한 다음 원하지 않는 열 뒤의 n개 열을 선택하시겠습니까? n번째 열을 삭제하는 간단한 함수는 없나요?
호기심에서 나온 것이기 때문에 예시는 없지만 필요하다면 예시를 드릴 수 있습니다.
답변1
좋아, 잘라내기 명령을 사용할 수 있지만 여전히 해당 열을 삭제하지는 않지만 원하는 열을 선택하고 무제한 열 옵션이 있습니다. 따라서 열 2를 선택하고 열 4 이후의 모든 열을 선택하려는 경우 한 가지 해결책은 다음과 같습니다.
cut -f 2,4- file.txt
그래도 실제 삭제 명령이 있는지 알고 싶습니다.
답변2
awk
실제로 행에서 필드를 제거하는 기능은 없지만 특정 열을 빈 문자열로 설정할 수 있습니다 .
그러나 열(예: 열 5 및 7)을 삭제하는 일반적인 방법이 있습니다.
awk '{$5=$7="" ; $0=$0;$1=$1}1'
$0을 자신에게 설정 $0=$0;$1=1
하고 $1을 자신에게 설정합니다. 이는 추가 필드 구분 기호(예: 현재 비어 있는 $5 및 $7 필드 바로 뒤에 있는 구분 기호)를 제거하는 부작용이 있습니다.
참고: 이는 또한 $0의 모든 필드 구분 기호를 현재 설정된 출력 필드 구분 기호(OFS)로 변환합니다(예: 기본 FS 및 OFS를 사용하면 다음으로 변환됩니다).여러 탭과 공백필드 사이에서하나의공간)
그리고 perl
훨씬 쉽습니다. 그것하다splice()
배열에서 열을 제거하는 함수( )가 있습니다 .
perl -lane 'BEGIN{$,=" "}; splice(@F,4,1); splice(@F,5,1); print @F'
$,=" "
출력 필드 구분 기호를 단일 공백으로 설정합니다.
노트:
Perl 배열은 1이 아닌 0부터 시작합니다.
@F[4]
다섯 번째 열도 마찬가지입니다.이렇게 하면 열 5가 삭제되므로 삭제하려는 두 번째 열(열 7)은 이제 열 6이므로
splice
두 번째 열이 삭제됩니다@F[5]
.
여기서 잠재적인 혼란을 피하려면 열을 역순으로 제거하세요.
perl -lane 'BEGIN{$,=" "}; splice(@F,6,1); splice(@F,4,1); print @F'
또는 루프를 사용할 수 있습니다.
perl -lane 'BEGIN{$,=" "}; foreach $c (7,5) {splice(@F,$c-1,1)}; print @F'
그런데 그냥 삭제하고 싶으시다면첫 번째또는마지막shift @F
열에는 , 또는 을 사용할 수 있습니다 pop @F
.
산출:
다음 입력을 사용하면:
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1
a b c d e f h i j k
모두위 스크립트는 다음과 같은 출력을 생성합니다.
1 2 3 4 6 8 9 10
10 9 8 7 5 3 2 1
a b c d f i j k
답변3
열의 의미에 따라 다릅니다. 실제로 구분된 필드가 아닌 문자 열을 참조하는 경우 모호한콤삭제할 시작 열 또는 일련의 열의 시작 및 끝 열을 지정할 수 있습니다. 한 번의 호출로 연속되지 않은 열을 삭제할 수 없습니다
답변4
나는 cut 명령이 당신에게 도움이 될 것이라고 생각합니까?
이전 답변에서 이것을 찾았습니다.https://stackoverflow.com/questions/13690461/using-cut-command-to-remove-multiple-columns
cut 명령에 대한 추가 정보: http://www.computerhope.com/unix/ucut.htm https://en.wikipedia.org/wiki/Cut_(유닉스)