🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Q&A

解決済

3回答

2221閲覧

bashで列での出力を行で出力

konaga

総合スコア1

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

0グッド

0クリップ

投稿2021/01/29 11:34

編集2021/01/29 14:11

前提・実現したいこと

シェルスクリプトのlog整形について、うまくいかず苦慮しています。
縦に出力された文字を横に出力したいです。

bash

1cat log.txt 2日付,ID,コード,時間,件数 320210101,1000,aaaa,01,2 420210101,1000,aaaa,02,6 520210101,1000,aaaa,03,5 6・・・・・・ 720210101,1000,aaaa,23,5 820210101,1001,bbbb,01,1 920210101,1001,bbbb,02,2 1020210101,1001,bbbb,03,3 11・・・・・・ 1220210101,1001,bbbb,23,4

bash

1日付,ID,コード,01,02,03,・・・23 220210101,1000,aaaa,2,6,5・・・,5 320210101,1001,bbbb,1,2,3・・・4

1時間ごとの件数をエクセルに転記するため、この形の出力が必要になります。
uniqやecho -nを使用すると思うのですが、ご存じであれば教えていただけないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Daregada

2021/01/29 13:02

出力結果に「コード」の値が抜けていませんか? ヘッダーには書いてありますね。
konaga

2021/01/29 14:12

ご指摘の通りです。ありがとうございます。
guest

回答3

0

興味があったのでPythonで書いてダミーのログを読ませてみましたが、これログがID別に時間通りに並んでいないとシェルスクリプトではつらいのでは。

Python

1import pandas as pd 2 3pd.set_option('display.unicode.east_asian_width', True) 4 5df = pd.read_csv("log.txt", dtype={'日付': 'object', 'ID': 'object', '時間': 'object'}) 6# print(df) 7 8df2 = df.pivot_table(index=["日付", "ID", "コード"], columns="時間", 9 values="件数", aggfunc=sum) 10df2.columns.name = None 11df2 = df2.reset_index() 12# print(df2) 13 14df2.to_csv("converted_log", index=None)

result

1日付,ID,コード,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23 220210101,1000,aaaa,2,6,5,5,6,7,8,9,10,11,12,12,11,10,9,8,7,6,5,4,3,2,5 320210101,1001,bbbb,1,2,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,4

log.txt

1日付,ID,コード,時間,件数 220210101,1000,aaaa,01,2 320210101,1000,aaaa,02,6 420210101,1000,aaaa,03,5 520210101,1000,aaaa,04,5 620210101,1000,aaaa,05,6 720210101,1000,aaaa,06,7 820210101,1000,aaaa,07,8 920210101,1000,aaaa,08,9 1020210101,1000,aaaa,09,10 1120210101,1000,aaaa,10,11 1220210101,1000,aaaa,11,12 1320210101,1000,aaaa,12,12 1420210101,1000,aaaa,13,11 1520210101,1000,aaaa,14,10 1620210101,1000,aaaa,15,9 1720210101,1000,aaaa,16,8 1820210101,1000,aaaa,17,7 1920210101,1000,aaaa,18,6 2020210101,1000,aaaa,19,5 2120210101,1000,aaaa,20,4 2220210101,1000,aaaa,21,3 2320210101,1000,aaaa,22,2 2420210101,1000,aaaa,23,5 2520210101,1001,bbbb,01,1 2620210101,1001,bbbb,02,2 2720210101,1001,bbbb,03,3 2820210101,1001,bbbb,04,3 2920210101,1001,bbbb,05,3 3020210101,1001,bbbb,06,3 3120210101,1001,bbbb,07,3 3220210101,1001,bbbb,08,3 3320210101,1001,bbbb,09,3 3420210101,1001,bbbb,10,3 3520210101,1001,bbbb,11,3 3620210101,1001,bbbb,12,3 3720210101,1001,bbbb,13,3 3820210101,1001,bbbb,14,3 3920210101,1001,bbbb,15,3 4020210101,1001,bbbb,16,3 4120210101,1001,bbbb,17,3 4220210101,1001,bbbb,18,3 4320210101,1001,bbbb,19,3 4420210101,1001,bbbb,20,3 4520210101,1001,bbbb,21,3 4620210101,1001,bbbb,22,3 4720210101,1001,bbbb,23,4

投稿2021/01/29 14:03

Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

単純な行列の交換であればいろいろありますが、
今回の場合は時間以降のみの行→列変換なので、汎用的なコマンドでは難しそうですね。

https://orebibou.com/ja/home/201606/20160607_002/

投稿2021/01/29 12:29

68user

総合スコア2022

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

抜けが無い前提で、

sh

1while IFS=, read day id code time cnt 2do if [ "$old" = "$day-$id" ] 3 then echo -n ",$cnt" 4 else echo 5 echo -n "$day,$id,$cnt" 6 fi 7 old="$day-$id" 8done < in-file > out-file 9echo >> out-file

ですかね。ヘッダはあとで、手修正です。

投稿2021/01/29 11:57

otn

総合スコア85893

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問