次のようにシェルスクリプトを実行すると、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
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
あなたは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
は3行ごとにゼロ(およびfalse)であるため、他の行は改行ではなくスペースで印刷されます。 next
は次の反復を開始するだけです。1
の後に改行が続くため、3行ごとにそのまま印刷されます。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
完全を期すために、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/
は、パターンバッファー内のすべての改行をタブに置き換えますi
、N
、およびy
のsedコマンド ここに記載されています 。
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