シェルスクリプトを使用して、テキストファイルの値を列化されたファイルに出力する方法


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 and Timestamp as following:

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 16

あなたの例は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形式でどのように印刷しますか。Excelシートの列ヘッダーをFilename StatusとTimestampとして、それらの下の値が
欲しい

@ linux09 ExcelとCSVおよびインポートを作成します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 % 33行ごとにゼロ(およびfalse)であるため、他の行は改行ではなくスペースで印刷されます。next次の反復を開始するだけです。
  • 1最初のブロックと一致しないため、最後の改行のために3行ごとにそのまま印刷されます。

5

rs(BSD r e s 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 パターンバッファーにさらに2行を読み込み、合計3行の改行で区切られた行を提供します
  • y/\n/\t/ すべての改行をパターンバッファー内のタブに置き換えます

iNおよびysedのコマンドはここに記載されています


すばらしい..使用した表現について簡単にコメントしていただけますか?THX!
カンパ

はい、完璧な男
カンパ

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) ])

ここでの基本的な考え方は、標準入力経由でスクリプト入力を提供することです(シェルのリダイレクトを使用します<が、パイプも使用できます)。スクリプトはタブを使用してフィールドを区切りますが、スペースを使用してより「微調整された」出力を行うこともできます。

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.