다음 파일(Linux.txt)이 있습니다.
linux-test01 linuxER
LinuxCV LinuxWE LinuxPL
LinuxDF LinuxXC LinuxSD LinuxAQ
다음 출력을 생성하기 위해 awk 또는 perl one-liner를 사용하여 어떻게 인쇄할 수 있습니까(출력은 새 파일 - LinuxNewOrder.txt에 있음)
linux-test01
LinuxCV
LinuxDF
linuxER
LinuxWE
LinuxXC
LinuxPL
LinuxSD
LinuxAQ
따라서 두 번째 열은 첫 번째 열 뒤에 있고, 세 번째 열은 두 번째 열 뒤에 오는 식입니다.
답변1
awk
및 다음의 조합을 사용하십시오 grep
.
awk -v RS=" " '{print}' Linux.txt | grep . > LinuxNewOrder.txt
더 간단한 방법은 다음을 사용하십시오 xargs
.
xargs -n 1 < Linux.txt > LinuxNewOrder.txt
답변2
그냥 awk를 사용하여 입력의 첫 번째 열을 인쇄한 다음 두 번째 열을 인쇄하세요.
awk '{ for (i = 1; i <= NF; i++) a[i] = a[i] "\n" $i }
END { for (i in a) print substr(a[i], 2) }' Linux.txt
배열을 사용하면 a
각 열에 대해 i
필드가 $i
에 연결됩니다 a[i]
. 입력이 끝나면 a[i]
전체 열 i가 포함됩니다. 마지막으로 $1`을 생략하고 열을 순서대로 인쇄합니다 "\n" which was stuffed in before
.
답변3
awk 색인 인쇄 필드에 대해 열별로 반복할 수 있습니다.
for i in $(seq $(awk '{print NF}' linux.txt | sort -nu | tail -n 1)); do awk -v field=$i '{print $field}' linux.txt | grep -v "^$"; done > LinuxNewOrder.txt
$ cat LinuxNeworder.txt
linux-test01
LinuxCV
LinuxDF
linuxER
LinuxWE
LinuxXC
LinuxPL
LinuxSD
LinuxAQ
추가 설명:
awk '{print NF}' linux.txt | sort -nu | tail -n 1
:최대 열 수 가져오기awk -v field=$i '{print $field}' linux.txt
i
: bash 변수를 열 인덱스로 사용하여 열별로 인쇄합니다.grep -v "^$"
: 빈 필드 삭제