Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.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 如何合并前12列?_Python_Bash_Text_Awk_Sed - Fatal编程技术网

Python 如何合并前12列?

Python 如何合并前12列?,python,bash,text,awk,sed,Python,Bash,Text,Awk,Sed,我有一个文本文件,其中包含如下文本: 某人的名字12347894 甚至更多的名字23455343 同样的65726456甚至更多 我是客户13247894 我是另一位客户56123657 我也是客户,我是第三号96317411 我是第四名,不是名单85299369中的最新一名 我现在是45679876 我需要从中创建一个CSV文件,但问题是名称包含12列,因此我需要将前12列的所有内容合并到1列中,以便CSV文件看起来像: 某人的名字,123456789456 给我一个包含前12列的文件。你能解

我有一个文本文件,其中包含如下文本:

某人的名字12347894 甚至更多的名字23455343 同样的65726456甚至更多 我是客户13247894 我是另一位客户56123657 我也是客户,我是第三号96317411 我是第四名,不是名单85299369中的最新一名 我现在是45679876 我需要从中创建一个CSV文件,但问题是名称包含12列,因此我需要将前12列的所有内容合并到1列中,以便CSV文件看起来像:

某人的名字,123456789456
给我一个包含前12列的文件。

你能解释一下第一列是名称吗?在数字之前,它们的最大名称列数是多少? 知道这一点可以相对容易地添加逗号并保存到.csv

tr -s '[:blank:]' ','

你能解释一下第一列是一个名称吗?在数字之前,最多有多少个名称列? 知道这一点可以相对容易地添加逗号并保存到.csv

tr -s '[:blank:]' ','

如果与名称相关的不同列是同一CSV列的一部分,因此应保持不变,为什么不只处理最后两列

$sed的/\t**\[0-9]\+\\t**\[0-9]\+\$/,\1、\2/“输入”文件 某人的名字,123456789456 甚至更多的名字,234567534312 更为相似的是,657212645613
如果与名称相关的不同列是同一CSV列的一部分,因此应保持不变,为什么不只处理最后两列

$sed的/\t**\[0-9]\+\\t**\[0-9]\+\$/,\1、\2/“输入”文件 某人的名字,123456789456 甚至更多的名字,234567534312 更为相似的是,657212645613
如果您不介意改用GNU AWK,您可以这样做:

gawk'BEGIN{FIELDWIDTHS=545;OFS=,}{print$1,$2,$3}文件 进一步解释:

您实际上有3列固定宽度的数据,因此FIELDWIDTHS=54 5 您希望输出字段分隔符为逗号,因此OFS=, 请注意,字段宽度是GNU AWK的一个特性

如果您不介意在CSV中保留空白,那么您就完成了

或者,如果您还需要删除空白,则:

呆呆的 开始{ 字段宽度=54 5 OFS=, } {
对于f=1;f如果您不介意改用GNU AWK,您可以这样做:

gawk'BEGIN{FIELDWIDTHS=545;OFS=,}{print$1,$2,$3}文件 进一步解释:

您实际上有3列固定宽度的数据,因此FIELDWIDTHS=54 5 您希望输出字段分隔符为逗号,因此OFS=, 请注意,字段宽度是GNU AWK的一个特性

如果您不介意在CSV中保留空白,那么您就完成了

或者,如果您还需要删除空白,则:

呆呆的 开始{ 字段宽度=54 5 OFS=, } {
对于f=1;f使用GNU表示\s/\s空间/非空间的缩写,使用-E启用ERE:

$ sed -E 's/\s+(\S+)\s+(\S+)$/,\1,\2/' file
Somename of someone,1234,7894
Even some more name,2345,5343
Even more of the same,6572,6456
I am a customer,1324,7894
I am another customer,5612,3657
Also I am a customer and I am number Three,9631,7411
And I am number four and not the latest one in list,8529,9369
And here I am,4567,9876
与任何POSIX sed的功能等效:

$ sed 's/[[:space:]]*\([^[:space:]]\{1,\}\)[[:space:]]*\([^[:space:]]\{1,\}\)$/,\1,\2/' file
Somename of someone,1234,7894
Even some more name,2345,5343
Even more of the same,6572,6456
I am a customer,1324,7894
I am another customer,5612,3657
Also I am a customer and I am number Three,9631,7411
And I am number four and not the latest one in list,8529,9369
And here I am,4567,9876
或使用任何awk:

$ awk -v OFS=',' '{x=$(NF-1) OFS $NF; sub(/([[:space:]]+[^[:space:]]+){2}$/,""); print $0, x}' file
Somename of someone,1234,7894
Even some more name,2345,5343
Even more of the same,6572,6456
I am a customer,1324,7894
I am another customer,5612,3657
Also I am a customer and I am number Three,9631,7411
And I am number four and not the latest one in list,8529,9369
And here I am,4567,9876

使用GNU表示空间/非空间的\s/\s缩写,并使用-E启用ERE:

$ sed -E 's/\s+(\S+)\s+(\S+)$/,\1,\2/' file
Somename of someone,1234,7894
Even some more name,2345,5343
Even more of the same,6572,6456
I am a customer,1324,7894
I am another customer,5612,3657
Also I am a customer and I am number Three,9631,7411
And I am number four and not the latest one in list,8529,9369
And here I am,4567,9876
与任何POSIX sed的功能等效:

$ sed 's/[[:space:]]*\([^[:space:]]\{1,\}\)[[:space:]]*\([^[:space:]]\{1,\}\)$/,\1,\2/' file
Somename of someone,1234,7894
Even some more name,2345,5343
Even more of the same,6572,6456
I am a customer,1324,7894
I am another customer,5612,3657
Also I am a customer and I am number Three,9631,7411
And I am number four and not the latest one in list,8529,9369
And here I am,4567,9876
或使用任何awk:

$ awk -v OFS=',' '{x=$(NF-1) OFS $NF; sub(/([[:space:]]+[^[:space:]]+){2}$/,""); print $0, x}' file
Somename of someone,1234,7894
Even some more name,2345,5343
Even more of the same,6572,6456
I am a customer,1324,7894
I am another customer,5612,3657
Also I am a customer and I am number Three,9631,7411
And I am number four and not the latest one in list,8529,9369
And here I am,4567,9876
粗糙的锥子

捕获最后两列,减少列数,这也会使间距正常化;然后打印。

a hacky awk


捕获最后两列,减少列数,这也将规范化间距;然后打印。

最后两列是否有可能是制表符分隔的,名称的子部分是否是空格分隔的?如果是这种情况,那么使用熊猫将很容易实现这一点,因为您在此处标记了Python,并发布了包含12个wo的更具代表性的记录rds在其第1列中并发布最终预期结果可能是sed的/[:blank:]\{1,\}\[0-9]\{1,\}\[:blank:]\{1,\}\[0-9]\{1,\}\$/,\1、\2/'file>newfile可以满足您的需要。@Dan我不太了解panda,…尝试一下:将panda作为pd导入,df=pd.read_csv'mydata.txt',sep='\t',df.to_csv'mydata_output.csv',index=false最后两列是否有制表符分隔,名称的子部分是否有空格分隔?如果是这种情况,很容易找到使用pandas可以理解这一点,因为您在这里标记了Python,在第一列中发布了一个包含12个单词的更具代表性的记录,并发布最终的预期结果可能是sed的/[[:blank:]\{1,\}\[0-9]\{1,\}\\[:blank:]\{1,\}\\\\\[0-9]\{1,\}\$/,\1、\2/'file>newfile可以满足您的需要。@Dan我不太了解panda,…试试这个:将panda作为pd导入,df=pd.read_csv'mydata.txt',sep='\t',df.to_csv'mydata_output.csv',index=false问题是,输入是大型机的格式化视图,如果我这样做的话,例如awk{'print$5'}有时我得到最后一列,一些行是第二列的一部分,主要是第一列的一部分,…如果我
uncut-d'-f1-11 inputfile | sed s/[:space:]/\\\/g | sed s/\t/\\/g | awk'{print$1:$2:$3:$4:$5:$6:$7:$8:$9:$10:$11:$12}输出我得到的文件在一列中只有名称以:分隔。然后下一部分,。。。如何获取其中的数字,…tr将用逗号替换整行的所有空格,包括第一个字域内的空格。问题是,输入是大型机的格式化视图,如果我这样做,例如awk{'print$5'},我有时会得到最后一列,有些行是第二列的一部分,主要是第一列的一部分,…如果我运行cut-d'-f1-11 inputfile | sed s/[:space:]/\\\/g | sed s/\t/\\/g | awk'{print$1:$2:$3:$4:$5:$6:$7:$8:$9:$10:$11:$12}输出,我会得到一列中只有名称以:分隔的文件。然后下一部分,。。。如何获取其中的数字,…tr将用逗号替换整行中的所有空格,包括第一个单词字段中的空格。它对应于您在问题中所写的预期输出,不是吗?少了什么?名字第一部分的双引号?如果是这样的话,添加就不难了:sed的/\.[a-z]\[\t]\+\[0-9]\+\[\t]\+\[0-9]\+\$/\1、\2、\3/'@EdMorton我的Scribot很好,谢谢:。我的观点是“不要试图合并前12列,而要处理最后2列”。我并不是在试图提供一个最好的便携式解决方案,特别是因为任何试图在类似情况下重复使用该解决方案的人都可能不得不对其进行调整。我确实喜欢您的版本,但带有\s和\s,可读性更强。它与您在问题中编写的预期输出相对应,不是吗?少了什么?名字第一部分的双引号?如果是这样的话,添加就不难了:sed的/\.[a-z]\[\t]\+\[0-9]\+\[\t]\+\[0-9]\+\$/\1、\2、\3/'@EdMorton我的Scribot很好,谢谢:。我的观点是“不要试图合并前12列,而要处理最后2列”。我并不是在试图提供一个最好的便携式解决方案,特别是因为任何试图在类似情况下重复使用该解决方案的人都可能不得不对其进行调整。我确实喜欢使用S和S的版本,但是它更可读。如果你不相信输入数据总是固定宽度的话,我认为这是更健壮的。是的,我通常认为SED首先是在单个行上简单替换的时候,因为代码通常简洁有效。尤其是GNU sed。老实说,如果我打算使用awk来实现这个目标,我不会将它视为固定宽度字段。我将添加一个awk解决方案作为参考。等一下……我明白了。但是不必阅读所有的正则表达式是FieldWidth的一个优势,你不认为吗?可能是,但我发布的代码不会有性能问题,改为FieldWidth会有所帮助,而且不值得不可移植性、健壮性降低,在这种情况下增加了复杂性。如果你不相信输入数据总是固定宽度的话,我认为这是更健壮的。是的,我通常认为SED首先是在单个行上简单替换的时候,因为代码通常是简洁高效的,尤其是GNU SED。老实说,如果我打算使用awk来实现这个目标,我不会将它视为固定宽度字段。我将添加一个awk解决方案作为参考。等一下……我明白了。但是不必阅读所有的正则表达式是FieldWidth的一个优势,你不认为吗?可能是的,但我发布的代码不会有性能问题,改为FieldWidth会有所帮助,而且在这种情况下,它不值得不可移植性、降低健壮性和增加复杂性。