Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python AWK在较大字符串中重新格式化结果(名称)的部分_Python_Bash_Awk - Fatal编程技术网

Python AWK在较大字符串中重新格式化结果(名称)的部分

Python 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号基思·兰德尔亚当斯 蒂芙尼价格

我的目标是将名称从倒数第一中间(LFM)重新格式化为倒数第一中间(FML),这是较大字符串的一部分。以下是一些示例数据:

姓名、地址1、地址2
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的较新版本。