
次の方法で多数のレコードを含むファイルがあります。
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
説明する:
現在のレコードを変数に保存
l
次のレコードを取得するために使用
getline
このレコードを印刷します(
print
引数なしで呼び出すと、常に現在のレコードが印刷されます)。次のレコードを取得するには、もう一度使用してください。
getline
レコード、改行文字、保存された最初のレコードを印刷します。
l
次の記録は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変換、およびクリーンアップを実行し、結果をコンパイルして実行するか、またはを使用して--explain
ASTをソースコードに再解析します。環境からパッケージをインポートし、不明または未定義のシンボルが原因で早期にエラーが発生します。
他の使用例を見るhttps://pypi.org/project/pypyp/。