파일의 처음 두 필드를 인쇄하는 방법은 무엇입니까?

파일의 처음 두 필드를 인쇄하는 방법은 무엇입니까?

다음과 같이 국가 이름과 해당 국가의 모바일 국가 코드 접두사가 포함된 파일이 있습니다.

United Kingdom   +44  ...more fields
United States Virgin Islands +1  ...more fields

국가명과 휴대폰 번호를 알아야 합니다. 따라서 정규식은 다음과 같습니다. 줄의 시작 부분부터 모든 단어를 읽은 다음 더하기 기호와 하나 이상의 숫자로 시작하는 문자열을 읽은 다음 중지합니다.

grep, cut, 심지어 sed로 몇 가지를 시도했지만 얻을 수 없습니다.

답변1

노력하다:

grep -o '^[^+]*+[0-9]\+' infile

[^+]*+처음 +발견되고 그 뒤에 하나 이상의 숫자가 올 때까지 모든 항목과 일치합니다.[0-9]\+

답변2

명령줄:

$ perl -lne 'print /^(.*?\+\d+)/' input.txt

이렇게 하면 입력에서 필요한 정보를 얻을 수 있습니다.

피복재:

  • /^(.*?\+\d+)/정규식은 더하기 기호가 처음 나타날 때까지 모든 것을 추출하고 그 뒤에 최소한 하나의 숫자 기호가 옵니다.
  • BOL이것은 캐럿을 통해 연결되므로 ^분명히 단 한 번의 일치만 발생할 수 있습니다.
  • 일치 항목이 print함수에 전달됩니다.
  • -lneoptions은 input.file의 각 줄에 대한 옵션 Perl에 지정된 코드를 실행하는 데 사용됩니다. Perl은 특별히 요청하지 않는 한 아무것도 인쇄하지 않습니다.-e-n

산출:

United Kingdom   +44
United States Virgin Islands +1

답변3

~부터당신은 말한다 공간파일에 사용되는 구분 기호입니다. 사용할 수 있어야 합니다.

cut -d ' ' -f 1-5 filename

파일에서 처음 5개 열을 추출합니다.

주어진 데이터에 대해 이는 다음을 산출합니다.

United Kingdom   +44
United States Virgin Islands +1

...하지만 이름에 2개 이상의 단어가 있는 국가는 (단지 2개가 아닌) 여러 영역에 걸쳐 있기 때문에 이는 단지 행운이라고 가정합니다.

sed각 줄의 첫 번째 숫자 집합 뒤의 모든 항목(예: 국가 코드 뒤의 모든 항목)을 제거하는 보다 안정적인 방법 :

sed 's/\([[:digit:]][[:digit:]]*\).*/\1/' filename

또는,

sed 's/\([[:digit:]]\{1,\}\).*/\1/' filename

또는 -E대신 확장 정규식을 사용하세요.

sed -E 's/([[:digit:]]+).*/\1/' filename

관련 정보