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

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

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

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

또한 |출력에서 ​​공백을 사용하는 대신 구분 기호를 유지하려는 경우 출력 필드 구분 기호를 지정할 수 있습니다. 불행하게도, 단지 flags 를 사용하는 것보다 조금 더 어색하지만 -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입력에 현재 시스템에서 유효한 문자를 형성하지 않는 바이트 또는 바이트 시퀀스가 ​​있는 경우에는 일반적으로 작동하지 않습니다. locale) 역할(예: 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

관련 정보