Python AWK在较大字符串中重新格式化结果(名称)的部分
我的目标是将名称从倒数第一中间(LFM)重新格式化为倒数第一中间(FML),这是较大字符串的一部分。以下是一些示例数据: 姓名、地址1、地址2Python AWK在较大字符串中重新格式化结果(名称)的部分,python,bash,awk,Python,Bash,Awk,我的目标是将名称从倒数第一中间(LFM)重新格式化为倒数第一中间(FML),这是较大字符串的一部分。以下是一些示例数据: 姓名、地址1、地址2 SmithJoe M,德克萨斯州巴黎苹果路123号 AdamsKeith Randall,加利福尼亚州萨利纳斯第一街543号 价格纽约市第32街11232号蒂芙尼 Walker科罗拉多州丹佛市西大街98号Karen E F 我想要的是: 姓名、地址1、地址2巴黎苹果路123号乔·M·史密斯 德克萨斯州萨利纳斯市第一街543号基思·兰德尔亚当斯 蒂芙尼价格
SmithJoe M,德克萨斯州巴黎苹果路123号
AdamsKeith Randall,加利福尼亚州萨利纳斯第一街543号
价格纽约市第32街11232号蒂芙尼
Walker科罗拉多州丹佛市西大街98号Karen E F
我想要的是: 姓名、地址1、地址2巴黎苹果路123号乔·M·史密斯 德克萨斯州萨利纳斯市第一街543号基思·兰德尔亚当斯
蒂芙尼价格,纽约州第32街11232号
卡伦E F Walker,科罗拉多州丹佛市西大街98号
我知道如何对第一列进行重新排序,但最终删除了行数据的其余部分:
# Return the first colum via comma seperation (name), then seperate by spaces
# If there are two strings but not three (only a last and first name),
# then change the order to first last.
awk -F, '{print $1}'| awk -F" " '$2!="" && $3=="" {print $2,$1}' >> names.txt
awk -F, '{print $1}'| awk -F" " '$3!="" && $4=="" {print $3,$1,$2}' >> names.txt
...# Continue to iterate column numbers
如果有更简单的方法把找到的最后一根绳子放到前面,我很想听听,但这是我真正的兴趣
我的问题是,我想对第一个逗号分隔字段的空格分隔字段重新排序(如上所述),但同时打印逗号分隔的其余数据。
有没有一种方法可以将地址信息存储在变量中,并将其附加在空格分隔的名称之后
或者,我可以做一些嵌套拆分吗
我目前正在用bash中的awk做这件事,但我愿意使用python/pandas或任何其他有效的方法
谢谢你的帮助 下面的AWK脚本虽然很难看,但可以为您的输入工作(使用
AWK-F,-F script.AWK
):
输出:
Joe M Smith, 123 Apple Rd, Paris TX
Keith Randall Adams, 543 1st Street, Salinas CA
Tiffany Price, 11232 32nd Street, New York NY
Karen E F Walker, 98 West Ave, Denver CO
Name, Address1, Address2
Joe M Smith, 123 Apple Rd, Paris TX
Keith Randall Adams, 543 1st Street, Salinas CA
Tiffany Price, 11232 32nd Street, New York NY
Karen E F Walker, 98 West Ave, Denver CO
Madonna, ...
Python中的相同解决方案:
import sys
import re
for line in sys.stdin:
parts = re.split('\s*,\s*', line)
names = parts[0].split()
print(", ".join([" ".join(names[1:] + names[:1])] + parts[1:]))
下面的AWK脚本虽然难看,但可用于您的输入(使用
AWK-F,-F script.AWK
):
输出:
Joe M Smith, 123 Apple Rd, Paris TX
Keith Randall Adams, 543 1st Street, Salinas CA
Tiffany Price, 11232 32nd Street, New York NY
Karen E F Walker, 98 West Ave, Denver CO
Name, Address1, Address2
Joe M Smith, 123 Apple Rd, Paris TX
Keith Randall Adams, 543 1st Street, Salinas CA
Tiffany Price, 11232 32nd Street, New York NY
Karen E F Walker, 98 West Ave, Denver CO
Madonna, ...
Python中的相同解决方案:
import sys
import re
for line in sys.stdin:
parts = re.split('\s*,\s*', line)
names = parts[0].split()
print(", ".join([" ".join(names[1:] + names[:1])] + parts[1:]))
使用sed看起来很糟糕,但效果很好:
sed -E '2,$s/^([^ ,]*) ([^ ,]*)( [^,]*)?/\2\3 \1/' in
和POSIX版本:
sed '2,$s/^\([^ ,]*\) \([^ ,]*\)\( [^,]*\)*/\2\3 \1/' in
输出:
使用sed看起来很糟糕,但效果很好:
sed -E '2,$s/^([^ ,]*) ([^ ,]*)( [^,]*)?/\2\3 \1/' in
和POSIX版本:
sed '2,$s/^\([^ ,]*\) \([^ ,]*\)\( [^,]*\)*/\2\3 \1/' in
输出:
又一个awk。这一项适用于标题行和麦当娜(即单字字段): 输出:
Joe M Smith, 123 Apple Rd, Paris TX
Keith Randall Adams, 543 1st Street, Salinas CA
Tiffany Price, 11232 32nd Street, New York NY
Karen E F Walker, 98 West Ave, Denver CO
Name, Address1, Address2
Joe M Smith, 123 Apple Rd, Paris TX
Keith Randall Adams, 543 1st Street, Salinas CA
Tiffany Price, 11232 32nd Street, New York NY
Karen E F Walker, 98 West Ave, Denver CO
Madonna, ...
又一个awk。这一项适用于标题行和麦当娜(即单字字段): 输出:
Joe M Smith, 123 Apple Rd, Paris TX
Keith Randall Adams, 543 1st Street, Salinas CA
Tiffany Price, 11232 32nd Street, New York NY
Karen E F Walker, 98 West Ave, Denver CO
Name, Address1, Address2
Joe M Smith, 123 Apple Rd, Paris TX
Keith Randall Adams, 543 1st Street, Salinas CA
Tiffany Price, 11232 32nd Street, New York NY
Karen E F Walker, 98 West Ave, Denver CO
Madonna, ...
缺少
-f
选项(已修复)。正如我所说,答案中有一个错误。我修复了它。有一个缺少的-f
选项(已修复)。正如我所说,答案中有一个错误。我修好了。你为什么用反斜杠逃避一切?你什么意思?您可以在答案中看到我的所有转义。我的意思是,为什么您不捕获组括号和问号,而使用扩展regexp和-r
?谢谢,我认为这不符合POSIX,但我想是的。改变了,你是对的,不是-r代表GNU-sed,-E代表GNU-sed和OSX/BSD-sed的更新版本。为什么要用反斜杠转义呢?什么意思?您可以在答案中看到我的所有转义。我的意思是,为什么您不捕获组括号和问号,而使用扩展regexp和-r
?谢谢,我认为这不符合POSIX,但我想是的。改变了,你是对的,不是-r仅适用于GNU sed,-E仅适用于GNU sed和OSX/BSD sed的较新版本。