두 번째 단어 시작 부분부터 세 번째 단어를 공백 20개로 정렬합니다. [중복]

두 번째 단어 시작 부분부터 세 번째 단어를 공백 20개로 정렬합니다. [중복]

우리는 다음과 같은 파일을 가지고 있습니다:

cat info.txt

linux03.sys98.com net16777728       Speed: 1000Mb/s
linux03.sys98.com net16777728       Speed: 1000Mb/s
linux01.sys98.com net3f0    Speed: 1000Mb/s
linux01.sys98.com net3f0    Speed: 1000Mb/s

linux03.sys98.com net16777728       Duplex: Full
linux03.sys98.com net16777728       Duplex: Full
linux01.sys98.com net3f0    Duplex: Full
linux01.sys98.com net3f0    Duplex: Full

linux04.sys98.com net3f2    Link detected: no
linux04.sys98.com net3f3    Link detected: no

linux04.sys98.com net3f2    Speed: Unknown!
linux04.sys98.com net3f3    Speed: Unknown!

linux04.sys98.com net3f2    Duplex: Unknown! (255)
linux04.sys98.com net3f3    Duplex: Unknown! (255)

linux03.sys98.com net16777728       Link detected: yes
linux03.sys98.com net16777728       Link detected: yes
linux01.sys98.com net3f0    Link detected: yes
linux01.sys98.com net3f0    Link detected: yes

예상대로 세 번째 단어를 두 번째 단어 시작 부분의 20개 공백에 정렬하려고 합니다.

linux03.sys98.com net16777728          Speed: 1000Mb/s
linux03.sys98.com net16777728          Speed: 1000Mb/s
linux01.sys98.com net3f0               Speed: 1000Mb/s
linux01.sys98.com net3f0               Speed: 1000Mb/s

linux03.sys98.com net16777728          Duplex: Full
linux03.sys98.com net16777728          Duplex: Full
linux01.sys98.com net3f0               Duplex: Full
linux01.sys98.com net3f0               Duplex: Full

linux04.sys98.com net3f2               Link detected: no
linux04.sys98.com net3f3               Link detected: no

linux04.sys98.com net3f2               Speed: Unknown!
linux04.sys98.com net3f3               Speed: Unknown!

linux04.sys98.com net3f2               Duplex: Unknown! (255)
linux04.sys98.com net3f3               Duplex: Unknown! (255)

linux03.sys98.com net16777728          Link detected: yes
linux03.sys98.com net16777728          Link detected: yes
linux01.sys98.com net3f0               Link detected: yes
linux01.sys98.com net3f0               Link detected: yes

printf나 다른 솔루션을 사용하여 이 작업을 어떻게 수행할 수 있습니까?

답변1

그리고 perl:

perl -ne 'printf "%s %-20s %s\n", /(\S+\s+)(\S+)\s*(.*)/' your-file

또는 패턴과 일치하지 않는 줄을 만지지 마십시오.

perl -pe '$_ = sprintf "%s %-20s %s\n", $1, $2, $3
            if /(\S+\s+)(\S+)\s*(.*)/' your-file

답변2

를 사용하면 sed두 번째 필드 뒤에 공백을 많이 추가하고 20번째 문자 뒤의 모든 내용을 제거할 수 있습니다.

sed -E 's/([^ ]* ){2}/&                   /;s/( .{20}) */\1/'

답변3

bash를 사용하면 다음과 같이 작성할 수 있습니다.

while read a b rest; do
    printf "%s %-20s %s\n" "$a" "$b" "$rest"
done < info.txt

관련 정보