その他のPypコメント

その他のPypコメント

次の方法で多数のレコードを含むファイルがあります。

Name
Address
Phone

これはファイルの各レコードの順序です。さて、このファイルを別のファイルにコピーし、次のように順序を変更したいと思います。

Address
Phone
Name

そのためにシェルスクリプトをどのように書くのですか?

答え1

努力する:

sed -n 'h;n;p;n;G;p' < file.in > file.out

たとえば、

$ seq 9 | sed -n 'h;n;p;n;G;p'
2
3
1
5
6
4
8
9
7

答え2

あなたの質問を正しく読んだら、ファイルから3行のシーケンスを取得し、各行の最初の行と最後の行の順序を変更したいですか? GNU sedを使用すると、次のことができるようです。

sed -e :a -e '$!N' -e 's/\(.*\)\n\(.*\)\n\(.*\)$/\2\n\3\n\1/;Ta' file

スワップができるまでラインを吸収し続け、再起動します。

答え3

そしてawk

awk '{l=$0;getline;print;getline;print $0"\n"l;}' < file_in > file_out

説明する:

  1. 現在のレコードを変数に保存l

  2. 次のレコードを取得するために使用getline

  3. このレコードを印刷します(print引数なしで呼び出すと、常に現在のレコードが印刷されます)。

  4. 次のレコードを取得するには、もう一度使用してください。getline

  5. レコード、改行文字、保存された最初のレコードを印刷します。l

  6. 次の記録は1から始めてください。

引用する

答え4

私が使用したいいくつかの単一行変換の場合pyp(「pypyp」として配布)

表示されていない行

行が表示されていない場合は、次のように無条件変換を実行できます(%3:0 - > 2 1 - > 0 2 - > 1)。

  • $ seq 9 | pyp '[elem for group in zip(lines[1::3],lines[2::3],lines[0::3]) for elem in group]'

より短い出力例は次のとおりです。

$ seq 6 | pyp '[elem for group in zip(lines[0::3],lines[2::3],lines[1::3]) for elem in group]'
1
3
2
4
6
5

マークライン

データ設定:

$ pyp -b 'faker.Faker.seed(202418);f=faker.Faker()' \
  'json.dumps(
     [dict(name=f.first_name(),
        address=f.address().replace("\n",", "),
        phone=f.phone_number())
      for i in range(2)])' \
| jq '.[]|to_entries[]|(.key + ": " + .value)' -r \
| tee q202418.data

プレフィックスによる解析はレコードほど強力ではありません。

$ <q202418.data \
  pyp -b 'f=lambda categ: filter(lambda l: l.startswith(categ), lines)' \
  'names=f("name:");
   addrs=f("address:");
   ps=f("phone:");
   [line for group in zip(addrs, ps, names) for line in group]'

より強力な複数行レコードの解析については、以下を参照してください。 https://stackoverflow.com/questions/13295083/parsing-a-multi-line-data-file-with-python

その他のPypコメント

pypフラグは--explain何が起こっているのかを示すか、スタンドアロンスクリプトとして保存するのに役立ちます。

$ seq 9 | pyp --explain '[elem for group in zip(lines[1::3],lines[2::3],lines[0::3]) for elem in group]'
#!/usr/bin/env python3
import sys
from pyp import pypprint
lines = [x.rstrip('\n') for x in sys.stdin]
output = [elem for group in zip(lines[1::3], lines[2::3], lines[0::3]) for elem in group]
if output is not None:
    pypprint(output)

PypはPYP_CONFIG_FILE

pypは入力コードに対して静的分析、いくつかのAST変換、およびクリーンアップを実行し、結果をコンパイルして実行するか、またはを使用して--explainASTをソースコードに再解析します。環境からパッケージをインポートし、不明または未定義のシンボルが原因で早期にエラーが発生します。

他の使用例を見るhttps://pypi.org/project/pypyp/

関連情報