여러 공백으로 구분하기 위해 잘라내기를 어떻게 사용합니까?


23

이 샘플의 마지막 열을 얻고 싶습니다.

[  3]  1.0- 2.0 sec  1.00 MBytes  8.39 Mbits/sec
[  3]  2.0- 3.0 sec   768 KBytes  6.29 Mbits/sec
[  3]  3.0- 4.0 sec   512 KBytes  4.19 Mbits/sec
[  3]  4.0- 5.0 sec   256 KBytes  2.10 Mbits/sec
...

내가 사용하면

cut -d\  -f 13

나는 얻다

Mbits/sec
6.29
4.19
2.10

때로는 사이에 추가 공백이 있기 때문입니다.


마지막 열은 Mbits/sec원하는 것입니까, 아니면 마지막 열입니까?
terdon

1
나는 두 번째 마지막 열, 숫자 만 얻고 싶습니다
rubo77

답변:


17

말 그대로 질문에 대답하려면 :

sed 's/   */:/g' | cut -d : -f 5

또는

awk -F '  +' '{print $5}'

그러나 괄호 안의 숫자가 10 등에 도달하면 그렇지 않습니다. 숫자에만 관심이 있다면 다른 모든 것을 제거 할 수 있습니다.

sed 's/[^.0-9][^.0-9]*/:/g' | cut -d : -f 6

예, 숫자
만은

@ rubo77 저에게 효과적입니다. 처음 두 가지 예는 제목에서 원하는 것을 정확하게 수행합니다. 아니면 장치를 제거하고 싶습니까? 이 경우 | sed 's/ .*//'처음 두 예제의 끝에 추가하십시오 . 물론 다른 많은 방법이 있습니다.
Gilles 'SO- 악마 그만해'

+대신에 약간 짧게 *: cat test | sed 's / [^. 0-9] \ + / : / g'| 컷 -d : -f 6
rubo77

@ rubo77 sed가 지원한다면, 그렇습니다. GNU와 BusyBox는 지원하지만 BSD 나 Solaris는 지원하지 않습니다. POSIX 지정 +?ERE하지만 잎 \+\?BRE의는 정의.
Gilles 'SO- 악마 그만'

22

squeeze 옵션 ( flag) tr과 함께 command를 사용 하여 여러 연속 된 모든 공백을 단일 공백으로 변환 한 다음 공백으로 구분 기호로 작업을 수행하면 숫자가있는 필수 열에 액세스 할 수 있습니다.-scut

아래 코드 스니핑을 참조하십시오.

cat file | tr -s ' ' | cut -d ' ' -f 8


4
이 답변은 더 높아야합니다. 그것은 지금까지 가장 간단하고 읽을 수있는 솔루션입니다.
Luke Davis

5

이 명령은 모두 공백으로 구분 된 파일의 마지막 열을 인쇄합니다.

  • awk '{print $NF}' file

    에서 awk, NF필드의 수이고 $NF마지막 필드입니다.

  • perl -lane 'print $F[$#F]' file

    -a배열에 공백의 파일로 분할 @F, $#F배열의 요소 수가 매우이다 $F[$#F]마지막 요소이다. -n수단은 명령 행에 지정된 파일을 읽고 함께 전달 된 스크립트 적용 -e각 라인을. 각 문장에 -l개행 문자 ( \n)를 추가하기 만하면 print됩니다.

  • sed 's/.* //g'

    모든 것을 마지막 공백과 일치시키고 삭제하고 마지막 열만 남기는 간단한 정규식.

  • rev file | cut -d' ' -f 1 | rev

    rev마지막 필드가 첫 번째 필드가되도록 출력을 반대로하고, cut인쇄 할 공간과 rev텍스트를 다시 정상으로 되돌릴 공간이 있습니다 . 연속 공백이 있으면 작동하지 않습니다 .

입력 내용에 따라 실제로 마지막 열은 원하지 않지만 두 번째 열은 두 번째 열을 원한다고 생각합니다. 이 경우 다음을 사용하여 마지막 2 ( 8.39 Mbits/sec) 를 인쇄하십시오 .

awk '{print $(NF-1),$NF}' file 
perl -lane 'print "$F[$#F-1] $F[$#F]"' file 
sed 's/.* \(.* .*\)/\1/' file 
rev file | cut -d' ' -f 1,2 | rev

그리고 이들은 두 번째 ( 8.39) 를 인쇄합니다 .

awk '{print $(NF-1)}' file 
perl -lane 'print $F[$#F-1]' file 
sed 's/.* \(.*\) .*/\1/' file 
rev file | cut -d' ' -f 2 | rev

4

cut수동 으로 공백을 여러 번 사용하여 분리 할 수 ​​없습니다 .

출력 필드는 한 번의 필드 분리 문자 문자로 구분됩니다.

텍스트가 같은 양으로 분리되거나 tr초과 텍스트 를 제거하는 데 사용하지 않는 한 .

그렇지 않으면 같은 다른 도구를 사용 awk, sed또는 ex.

예를 들면 다음과 같습니다.

ex -s +'%norm $2Bd0' +%p +q! foo.txt

교체 +q!로하면 -cwq현재 위치에서 변경 사항을 저장합니다.


0

펄 원 라이너를 다음과 같이 사용하십시오.

perl -lane 'print $F[-2]' input_file

설명:

옵션 -e은 perl 인터프리터가 파일이 아닌 스크립트를 인라인으로 찾도록합니다.

옵션 -n은 입력 (파이프의 파일 또는 STDIN)을 한 줄씩 읽습니다.

옵션 -l은 행을 읽은 후 입력 레코드 구분 기호 (OS에 따라, UNIX에서는 기본적으로 줄 바꿈)를 제거하고 끝에 모든 행을 추가합니다.print

옵션 -a배열 공백에 분할하기 위해 각 입력 라인이 발생 @F하고, $F[-2]원하는 필드 단부로부터 제 2 엘리먼트 계수이다. 배열의 마지막 인덱스 인 $F[$#F-1]where를 사용할 수도 있습니다 .$#F@F

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.