如何将一列数据(文本)包装成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>