awk - $0을 인쇄하고 OFS를 무시합니다.

awk - $0을 인쇄하고 OFS를 무시합니다.

각 열/필드를 출력하고 싶지만 변수를 사용하여 이 작업을 수행하면 $0기본 변수가 단일 변수로 무시되므로 계속 인쇄됩니다.OFSspace:

내가 시도한 명령은 다음과 같습니다.

cat /etc/passwd | awk -F':' '{print $0}'

다음 예제 입력을 고려하면 다음과 같습니다.

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

명령에서 다음 출력을 얻습니다.

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

그러나 나는 내 출력이 다음과 같기를 원합니다.

root x 0 0 root /root /bin/bash
daemon x 1 1 daemon /usr/sbin /usr/sbin/nologin

당신의 도움을 주셔서 감사합니다:)

답변1

$0입력 필드 구분 기호를 포함하여 전체 줄을 나타냅니다.

필드를 설정하고 출력 필드 구분자를 사용하여 분할하고 다시 결합할 수 있습니다.

</etc/passwd  awk -F: '{$1=$1;print}'

(고문 대신 파일에서 직접 읽었습니다 cat;-)

이 내용은 다음과 같이 기록됩니다.필드 내용 변경GNU 구현 매뉴얼 섹션 awk(일명 gawk):

마지막으로 awksum 필드의 현재 값을 사용하여 전체 레코드를 강제로 다시 작성하는 것이 편리한 경우가 있습니다 OFS. 이렇게 하려면 겉으로는 무해해 보이는 할당을 사용합니다.

$1 = $1   # force record to be reconstituted
print $0  # or whatever else with $0

이로 인해 awk기록이 재구성되었습니다. 여기에 표시된 것처럼 주석을 추가하면 정말 도움이 될 수 있습니다.

답변2

$0 필드는 행일 뿐이며 구문 분석되지 않습니다. NF 변수(FS에 의해 결정된 필드 수)를 사용하여 각 필드를 반복해야 합니다.

cat /etc/passwd | awk -F':' '{for (i=1;i<=NF;i++) {printf "%s ",$i}; printf "\n"};'

관련 정보