我有一个文件,其中包含以下方式的大量记录。
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
解释:
将当前记录保存在变量中
l
使用获取下一条记录
getline
打印该记录(
print
不带参数调用将始终打印当前记录)使用再次获取下一条记录
getline
打印该记录、换行符和存储在的第一条记录
l
对于下一条记录,从 1 开始。
参考
- awk字符串函数
答案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/。