Bash:行を配列要素に変換

Bash:行を配列要素に変換

私のmacOSシステムには、次の形式のlog.txtがあります。

#State:      a           b        c
State 1:118.851979 120.668604 84.472229
State 2:126.789728 149.506520 103.196917
State 3:126.379687 149.382354 104.504792
State 4:126.989312 149.372811 103.499396
State 5:126.330563 149.373374 103.956438
State 6:127.238791 149.458749 103.198541
State 7:125.263833 132.658750 88.320687
State 8:126.828000 148.570000 98.722229
State 9:125.042667 147.087896 98.871813
State 10:124.392521 148.656792 103.744938
State 11:115.969084 131.787022 91.721250
State 12:125.385521 135.633751 91.044167
State 13:125.046354 149.432500 104.132167
State 14:126.368354 149.454480 103.942208
State 15:126.454229 149.583730 104.462458
State 16:114.102083 134.422916 93.555625
State 17:127.905604 138.012417 85.556396
State 18:126.362271 149.187688 104.087229
State 19:115.580250 133.450563 93.011062
State 20:125.555854 133.653730 88.441501

次のようなPythonのような配列形式に変換する線形ソリューションが必要です。

[[118.851979, 120.668604, 84.472229],[126.789728, 149.506520, 103.196917]...[125.555854, 133.653730, 88.441501]]

そのため、各行(2、3、4列)から3つの数字をすべて取り、[]要素に配列しました。

[[a, b, c],[a, b, c],[a, b, c]..[a, b , c]]

ベストアンサー1

離れてawkいる:

$ awk -F'[ :]' 'BEGIN{printf "["}NR>1{printf "[%s,%s,%s],",$3,$4,$5}END{printf "]\n"}' file | sed 's/,\]$/]/'
[[118.851979,120.668604,84.472229],[126.789728,149.506520,103.196917],[126.379687,149.382354,104.504792],[126.989312,149.372811,103.499396],[126.330563,149.373374,103.956438],[127.238791,149.458749,103.198541],[125.263833,132.658750,88.320687],[126.828000,148.570000,98.722229],[125.042667,147.087896,98.871813],[124.392521,148.656792,103.744938],[115.969084,131.787022,91.721250],[125.385521,135.633751,91.044167],[125.046354,149.432500,104.132167],[126.368354,149.454480,103.942208],[126.454229,149.583730,104.462458],[114.102083,134.422916,93.555625],[127.905604,138.012417,85.556396],[126.362271,149.187688,104.087229],[115.580250,133.450563,93.011062],[125.555854,133.653730,88.441501]]

またはより明確に言えば:

awk -F'[ :]' 'BEGIN{
                printf "["
              }
              NR>1{
                printf "[%s,%s,%s],",$3,$4,$5
              }
              END{
                printf "]\n"
              }' file | sed 's/,\]$/]/'

説明する

  • awk -F'[ :]':awkの入力フィールドの区切り文字を空白または:
  • BEGIN{printf "["}:始めを印刷します[
  • NR>1{printf "[%s,%s,%s],",$3,$4,$5}: 最初の行を除く各行について、a 内の 3 番目、4 番目、5 番目のフィールドを[ ]カンマで区切って印刷します。
  • END{printf "]\n"}:結論を印刷します]
  • sed 's/,\]$/]/',:ENDブロックの前に最後に追加された内容を削除します。

おすすめ記事