쉘 명령을 사용하여 텍스트 파일의 첫 번째 열과 마지막 열만 표시하는 방법은 무엇입니까?

쉘 명령을 사용하여 텍스트 파일의 첫 번째 열과 마지막 열만 표시하는 방법은 무엇입니까?

sed 명령을 사용하여 텍스트 파일의 첫 번째 열과 마지막 열만 표시하는 방법을 알아내려면 도움이 필요합니다. 컬럼 1에 대해 지금까지 얻은 내용은 다음과 같습니다.

cat logfile | sed 's/\|/ /'|awk '{print $1}'

마지막 열도 표시하려는 나의 미약한 시도는 다음과 같습니다.

cat logfile | sed 's/\|/ /'|awk '{print $1}{print $8}'

그러나 이는 첫 번째 열과 마지막 열을 가져와 하나의 목록으로 병합합니다. sed 및 awk 명령을 사용하여 첫 번째 열과 마지막 열을 명확하게 인쇄하는 방법이 있습니까?

샘플 입력:

foo|dog|cat|mouse|lion|ox|tiger|bar

답변1

거의 다 왔어. 두 열 참조를 서로 옆에 놓으십시오.

cat logfile | sed 's/|/ /' | awk '{print $1, $8}'

또한 여기서는 필요하지 않습니다 cat.

sed 's/|/ /' logfile | awk '{print $1, $8}'

awk또한 열 구분 기호가 |공백 대신 이므로 둘 중 하나도 필요하지 않다는 것을 알 수 있습니다 sed.

awk -F '|' '{print $1, $8}' logfile

에 따라제안~에 의해갈렙, 정확히 8개가 아니더라도 마지막 필드를 출력하는 솔루션을 원하는 경우 를 사용할 수 있습니다 $NF.

awk -F '|' '{print $1, $NF}' logfile

또한 출력에서 ​​구분 기호를 유지하려면 |공백을 사용하는 대신 출력 필드 구분 기호를 지정할 수 있습니다. 불행히도 플래그를 사용하는 것보다 조금 더 어색 -F하지만 여기에 세 가지 접근 방식이 있습니다.

  • awkBEGIN 블록에서 입력 및 출력 필드 구분 기호를 자체적으로 할당할 수 있습니다 .

    awk 'BEGIN {FS = OFS = "|"} {print $1, $8}' logfile
    
  • awk명령줄에서 호출할 때 플래그를 통해 이러한 변수를 할당할 수 있습니다 -v.

    awk -v 'FS=|' -v 'OFS=|' '{print $1, $8}' logfile
    
  • 또는 간단하게:

    awk -F '|' '{print $1 "|" $8}' logfile
    

답변2

awk어쨌든 사용하고 있습니다 :

awk '{ print $1, $NF }' file

답변3

처음부터 끝까지 (또는 원하는 경우 공백) |로 바꾸십시오.|

sed 's/|.*|/|/'

sed특별한 구현 은 없지만 |(펼친정규 표현식은 일부 구현을 통해 활성화되지 않습니다 -E. -r\|자체는 GNU 와 같은 일부에서는 특별합니다 sed. 그래서 당신은해야~ 아니다|문자 와 일치시키려는 경우 탈출하십시오 |.

공백으로 바꾸고 입력에 이미 하나만 있는 줄이 포함되어 있는 경우 해당 줄과 일치하지 않는 |것으로 특별히 처리해야 합니다 . |.*|그것은 다음과 같을 수 있습니다:

sed 's/|\(.*|\)\{0,1\}/ /'

(즉, 해당 .*|부분을 선택적으로 만듭니다) 또는:

sed 's/|.*|/ /;s/|/ /'

또는:

sed 's/\([^|]*\).*|/\1 /'

입력의 필드 수에 관계없이 첫 번째 및 여덟 번째 필드를 원하는 경우 다음과 같습니다.

cut -d'|' -f1,8


(모든 항목은 입력이 유효한 텍스트를 형성한다고 가정하는 모든 POSIX 호환 유틸리티에서 작동합니다. 특히 입력 에 sed현재 로케일에서 유효한 문자를 형성하지 않는 바이트 또는 바이트 시퀀스가 ​​있는 경우 일반적으로 작동하지 않습니다. printf 'unix|St\351phane|Chazelas\n' | sed 's/|.*|/|/'UTF-8 로캘)).

답변4

로 구분된 텍스트의 첫 번째 필드와 마지막 필드를 가져오려는 것 같습니다 |.

귀하의 로그 파일에 아래와 같은 텍스트가 포함되어 있다고 가정합니다.

foo|dog|cat|mouse|lion|ox|tiger|bar
bar|dog|cat|mouse|lion|ox|tiger|foo

그리고 당신은 다음과 같은 출력을 원합니다.

foo bar
bar foo

그렇다면 여기에 귀하의 명령이 제공됩니다.

GNU sed를 통해,

sed -r 's~^([^|]*).*\|(.*)$~\1 \2~' file

예:

$ echo 'foo|dog|cat|mouse|lion|ox|tiger|bar' | sed -r 's~^([^|]*).*\|(.*)$~\1 \2~'
foo bar

관련 정보