如何将一列数据(文本)包装成8列并且可以以8列样式放入excel?
How to wrap one column of data(text) into 8 columns and can be dropped in excel with 8 columns style?
我有一长列文本数据,像这样:
apple
162
30.45%
newyork
red
2018-12-10 22:48
3.23
Nop12345
pear
20
14.56%
washington
green
2018-12-09 10:30
4.24
Nok45367
我希望它用制表符分隔,如下所示,它可以放在 excel 中,有 8 列:
apple 162 30.45% newyork red 2018-12-10 12:48 3.23 Nop12345
pear 20 14.56% washington green 2018-12-09 10:30 4.24 Nok45367
我用过命令
awk '{ ORS = (NR%8 ? "\t" : RS) } 1' > output.txt
为了处理这些东西,如果你在 windows 附件记事本编辑器上看到结果,输出就像我上面需要的结构,然而,事实
是当你用 notepad++ 或 linux 上的其他 txt 编辑器看到它时,它不是 8 列样式,更糟糕的是,如果你将它放在 excel 中,它只显示 2 列] 像这样:
apple
162
30.45%
newyork
red
2018-12-10 12:48
3.23
Nop12345
pear
20
14.56%
washington
green
2018-12-09 10:30
4.24
Nok45367
用awk
既然你已经尝试过了,请你试试下面。将 | column -t
附加到以下代码,以防您需要以 TAB 分隔形式输出。
awk '
/[a-zA-z]+[0-9]+/{
print val OFS [=10=]
val=""
next
}
NF{
val=(val?val OFS:"")[=10=]
}
END{
if(val){
print val
}
}' Input_file
另外,当我尝试你的代码时,我能够得到正确的输出(添加上面的解决方案作为替代方案),请你检查一下你的 Input_file 是否在其中包含控制 M 字符,方法是 cat -v Input_file
如果是,则尝试通过 td -d '\r' < Input_file > temp_file && mv temp_file Input_file
.
删除它们
说明:在此处添加上述代码的说明。
awk ' ##Starting awk program here.
/^[a-zA-z]+[0-9]+/{ ##Checking condition if a line is starting alphabets with digits then do following.
print val OFS [=11=] ##Printing variable val with OFS and current line here.
val="" ##Nullifying val here.
next ##next will skip all further statements here.
}
NF{ ##Checking condition if line is NOT BLANK then do following.
val=(val?val OFS:"")[=11=] ##Creating variable val whose value keep concatenating its own value.
}
END{ ##Starting END block of this awk code here.
if(val){ ##Checking condition in case variable val is NOT NULL then do following.
print val ##Printing variable val here.
}
}' Input_file ##Mentioning Input_file name here.
input.txt
代码
import os
import numpy as np
import pandas as pd
text_file = open("input.txt", "r")
n = 8
raw_data = text_file.read().split("\n")
data = np.array(raw_data)
data.shape = (len(data)//n, n)
df = pd.DataFrame(data)
df.to_excel("output.xlsx", index=False, header=False)
output.xlsx显示在Excel
你已经拥有的是做你想做的事情的正确方法:
$ awk '{ORS=(NR%8 ? "\t" : RS)}1' file
apple 162 30.45% newyork red 2018-12-10 22:48 3.23 Nop12345
pear 20 14.56% washington green 2018-12-09 10:30 4.24 Nok45367
但请参阅 了解大多数 "my output looks funny" 问题的来源。
检查这个 awk 解决方案:
/tmp> cat james.txt
apple
162
30.45%
newyork
red
2018-12-10 22:48
3.23
Nop12345
pear
20
14.56%
washington
green
2018-12-09 10:30
4.24
Nok45367
/tmp> awk -F" " '{ printf("%s\t",[=10=]); if(NR%8==0) { printf("\n") } } ' james.txt
apple 162 30.45% newyork red 2018-12-10 22:48 3.23 Nop12345
pear 20 14.56% washington green 2018-12-09 10:30 4.24 Nok45367
/tmp>
感谢 Ed,进一步缩短
/tmp> awk '{ printf "%s\t",[=11=]; if(NR%8==0) { print "" } } ' james.txt
apple 162 30.45% newyork red 2018-12-10 22:48 3.23 Nop12345
pear 20 14.56% washington green 2018-12-09 10:30 4.24 Nok45367
/tmp>
我有一长列文本数据,像这样:
apple
162
30.45%
newyork
red
2018-12-10 22:48
3.23
Nop12345
pear
20
14.56%
washington
green
2018-12-09 10:30
4.24
Nok45367
我希望它用制表符分隔,如下所示,它可以放在 excel 中,有 8 列:
apple 162 30.45% newyork red 2018-12-10 12:48 3.23 Nop12345
pear 20 14.56% washington green 2018-12-09 10:30 4.24 Nok45367
我用过命令
awk '{ ORS = (NR%8 ? "\t" : RS) } 1' > output.txt
为了处理这些东西,如果你在 windows 附件记事本编辑器上看到结果,输出就像我上面需要的结构,然而,事实 是当你用 notepad++ 或 linux 上的其他 txt 编辑器看到它时,它不是 8 列样式,更糟糕的是,如果你将它放在 excel 中,它只显示 2 列] 像这样:
apple
162
30.45%
newyork
red
2018-12-10 12:48
3.23
Nop12345
pear
20
14.56%
washington
green
2018-12-09 10:30
4.24
Nok45367
用awk
既然你已经尝试过了,请你试试下面。将 | column -t
附加到以下代码,以防您需要以 TAB 分隔形式输出。
awk '
/[a-zA-z]+[0-9]+/{
print val OFS [=10=]
val=""
next
}
NF{
val=(val?val OFS:"")[=10=]
}
END{
if(val){
print val
}
}' Input_file
另外,当我尝试你的代码时,我能够得到正确的输出(添加上面的解决方案作为替代方案),请你检查一下你的 Input_file 是否在其中包含控制 M 字符,方法是 cat -v Input_file
如果是,则尝试通过 td -d '\r' < Input_file > temp_file && mv temp_file Input_file
.
说明:在此处添加上述代码的说明。
awk ' ##Starting awk program here.
/^[a-zA-z]+[0-9]+/{ ##Checking condition if a line is starting alphabets with digits then do following.
print val OFS [=11=] ##Printing variable val with OFS and current line here.
val="" ##Nullifying val here.
next ##next will skip all further statements here.
}
NF{ ##Checking condition if line is NOT BLANK then do following.
val=(val?val OFS:"")[=11=] ##Creating variable val whose value keep concatenating its own value.
}
END{ ##Starting END block of this awk code here.
if(val){ ##Checking condition in case variable val is NOT NULL then do following.
print val ##Printing variable val here.
}
}' Input_file ##Mentioning Input_file name here.
input.txt
代码
import os
import numpy as np
import pandas as pd
text_file = open("input.txt", "r")
n = 8
raw_data = text_file.read().split("\n")
data = np.array(raw_data)
data.shape = (len(data)//n, n)
df = pd.DataFrame(data)
df.to_excel("output.xlsx", index=False, header=False)
output.xlsx显示在Excel
你已经拥有的是做你想做的事情的正确方法:
$ awk '{ORS=(NR%8 ? "\t" : RS)}1' file
apple 162 30.45% newyork red 2018-12-10 22:48 3.23 Nop12345
pear 20 14.56% washington green 2018-12-09 10:30 4.24 Nok45367
但请参阅
检查这个 awk 解决方案:
/tmp> cat james.txt
apple
162
30.45%
newyork
red
2018-12-10 22:48
3.23
Nop12345
pear
20
14.56%
washington
green
2018-12-09 10:30
4.24
Nok45367
/tmp> awk -F" " '{ printf("%s\t",[=10=]); if(NR%8==0) { printf("\n") } } ' james.txt
apple 162 30.45% newyork red 2018-12-10 22:48 3.23 Nop12345
pear 20 14.56% washington green 2018-12-09 10:30 4.24 Nok45367
/tmp>
感谢 Ed,进一步缩短
/tmp> awk '{ printf "%s\t",[=11=]; if(NR%8==0) { print "" } } ' james.txt
apple 162 30.45% newyork red 2018-12-10 22:48 3.23 Nop12345
pear 20 14.56% washington green 2018-12-09 10:30 4.24 Nok45367
/tmp>