其他 pyp 注释

其他 pyp 注释

我有一个文件,其中包含以下方式的大量记录。

Name
Address
Phone

这是该文件中每条记录的顺序。现在,我想将此文件复制到其他文件,并更改顺序,如下所示。

Address
Phone
Name

如何编写shell脚本来做到这一点?

答案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 转换和修剪,然后编译并执行结果,或者使用--explain,将 AST 解解析回源代码。它从其环境中导入包,并在未知或未定义的符号上尽早出错。

请参阅其他使用示例https://pypi.org/project/pypyp/

相关内容