쉘 스크립트를 사용하여 텍스트 파일의 값을 열 파일로 인쇄하는 방법


11

다음과 같이 쉘 스크립트를 실행하여 output.txt가 있습니다.

abc.txt
errorstatus1
Fri Nov 11 02:00:09 2016
def.txt
errorstatus2.txt
Sat Nov 12 03:00:09 2016

텍스트 파일에는 같은 방식으로 여러 항목이 한 줄씩 있습니다. 이 값을 Filename, Status 및 Timestamp 열에 다음과 같이 인쇄하고 싶습니다.

Filename      Status        Timestamp
abc.txt     errorstatus1   Fri Nov 11 02:00:09 2016
def.txt     errorstatus2   Sat Nov 12 03:00:09 2016

4
예제 형식은 CSV 파일이 아니며 고정 열 너비 파일입니다. 질문을 명확히하거나 올바른 예를 제시 할 수 있습니다.
AlexP

귀하의 예는 CVS 형식 이 아닙니다 . CVS 형식은 abc.txt,errorstatus1,Fri Nov 11 02:00:09 2016입니다. 귀하가 제공 한 예제와 일치하도록 질문을 편집했습니다. 롤백 해 주시기 바랍니다. 그러나 열 값 또는 쉼표로 구분 된 값을 정확히 정확히 지정해야합니다.
Sergiy Kolodyazhnyy

답변:


14

paste:

paste - - - <file.txt

그러면 줄 바꿈으로 구분 된 파일 내용이 열로, 줄당 3 개의 탭으로 구분 된 열이 출력됩니다.

헤더 추가 :

echo Filename Status Timestamp; paste - - - <file.txt

출력을 열화하려면 column다음의 도움을 받으십시오 .

{ echo Filename Status Timestamp; paste - - - <file.txt ;} | column -t

예:

% cat file.txt
abc.txt
errorstatus1
Fri Nov 11 02:00:09 2016
def.txt
errorstatus2.txt
Sat Nov 12 03:00:09 2016

% { echo Filename Status Timestamp; paste - - - <file.txt ;} | column -t
Filename  Status            Timestamp
abc.txt   errorstatus1      Fri        Nov  11  02:00:09  2016
def.txt   errorstatus2.txt  Sat        Nov  12  03:00:09  2016

멋있는! 감사!! 그러나 이러한 값을 Excel 형식으로 인쇄하는 방법은 무엇입니까? 나는 파일 이름 상태 및 타임 스탬프와 그 아래의 값으로 엑셀 시트에 열 헤더를 원하는
linux09

@ linux09 CSV를 작성하고 Excel로 가져 오기 :echo Filename,Status,Timestamp; paste -d ',' - - - <file.txt
heemayl

훌륭한! 매력처럼 작동합니다. 대단히 감사합니다
linux09

6

awk를 사용할 수 있습니다.

awk 'NR % 3 {printf "%s ", $0; next}1'

출력이 예쁘지 않을 수 있습니다.

$ awk 'NR % 3 {printf "%s ", $0; next} 1' input
abc.txt errorstatus1 Fri Nov 11 02:00:09 2016
def.txt errorstatus2.txt Sat Nov 12 03:00:09 2016

%s\t대신 탭으로 구분 된 출력에 사용할 수 있습니다 .

  • NR % 3세 번째 줄마다 0 (및 거짓)이므로 다른 줄은 줄 바꿈 대신 공백으로 인쇄됩니다. next다음 반복을 시작합니다.
  • 모든 세 번째 줄은 final로 인해 그대로 인쇄되며 1, 첫 번째 블록과 일치하지 않기 때문에 줄 바꿈 뒤에 그 줄 바꿈이 표시됩니다.

5

도 있습니다 rs(BSD의 r에 전자 HAPE 유틸리티) :

DESCRIPTION
     rs reads the standard input, interpreting each line as a row of blank-
     separated entries in an array, transforms the array according to the
     options, and writes it on the standard output.  With no arguments it
     transforms stream input into a columnar format convenient for terminal
     viewing.

특히,

     -e      Consider each line of input as an array entry.

그래서

$ rs -e < file
abc.txt                   errorstatus1              Fri Nov 11 02:00:09 2016
def.txt                   errorstatus2.txt          Sat Nov 12 03:00:09 2016

또는 (헤더 추가)

$ { printf '%s\n' Filename Status Timestamp ; cat file ; } | rs -e
Filename                  Status                    Timestamp
abc.txt                   errorstatus1              Fri Nov 11 02:00:09 2016
def.txt                   errorstatus2.txt          Sat Nov 12 03:00:09 2016

3

완성도를 높이려면 다음을 수행하십시오 sed.

sed -e '1iFilename\tStatus\tTimestamp' -e 'N;N;y/\n/\t/' file.txt
  • 1iFilename\tStatus\tTimestamp 행 1 앞에 헤더 행을 삽입합니다
  • N;N 패턴 버퍼에 두 줄을 더 읽어서 총 3 개의 줄 바꿈으로 구분 된 줄을 제공합니다.
  • y/\n/\t/ 패턴 버퍼에서 모든 줄 바꾸기를 탭으로 바꿉니다.

i, N그리고 y나오지도 명령은 여기에 설명되어 있습니다 .


훌륭합니다 .. 사용한 표현에 대해서도 간단히 언급 할 수 있습니까? 고마워!
Campa

예, 완벽한 친구
Campa

1

AWK 또는 Perl을 사용하여 텍스트 처리를 위해 무언가를 요리 할 수 ​​있으며 물론이 답변이 제공하는 Python도 가능합니다.

하나의 라이너로 :

python -c 'import sys;print "Filename\tStatus\tTimestamp"; lines=[l.strip() for l in sys.stdin];print "".join([l+"\n" if i%3 == 0 else l+"\t" for i,l in enumerate(lines,1) ])' < input.txt

여러 줄 스크립트로

import sys
print "Filename\tStatus\tTimestamp"
lines=[l.strip() for l in sys.stdin]
print "".join([l+"\n" if i%3 == 0 else l+"\t" for i,l in enumerate(lines,1) ])

기본 아이디어는 stdin을 통해 스크립트 입력을 제공하는 것입니다 ( <파이프도 사용할 수 있지만 쉘의 리디렉션 사용). 스크립트는 탭을 사용하여 필드를 구분하지만 공백을 사용하여 "미세 조정 된"출력에 사용할 수도 있습니다.

OP에서 제공 한 입력 예를 사용한 샘플 출력 :

$ python -c 'import sys;print "Filename\tStatus\tTimestamp";                                   
> lines=[l.strip() for l in sys.stdin];
> print "".join([l+"\n" if i%3 == 0 else l+"\t" for i,l in enumerate(lines,1) ])' < input.txt
Filename    Status  Timestamp
abc.txt errorstatus1    Fri Nov 11 02:00:09 2016
def.txt errorstatus2    Sat Nov 12 03:00:09 2016
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.