Как обернуть один столбец данных (текст) в 8 столбцов и может быть отброшен в Excel со стилем 8 столбцов? - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть длинный столбец текстовых данных, которому это нравится:

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, однако, правда в том, чтоэто не стиль 8 столбцов, когда вы видите его в notepad ++ или каком-либо другом текстовом редакторе в linux, и хуже всего то, что он представлен только с 2 столбцами, если вы уроните его в Excel следующим образом:

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

Ответы [ 4 ]

0 голосов
/ 13 декабря 2018

Проверьте это решение 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",$0); 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>

Благодаря Эду, сокращается далее

/tmp> awk '{ printf "%s\t",$0; 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>
0 голосов
/ 13 декабря 2018

input.txt enter image description here

Код

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

enter image description here

0 голосов
/ 13 декабря 2018

То, что у вас уже есть, является правильным способом сделать то, что вы хотите:

$ 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

, но посмотрите Почему выходные данные моего инструмента перезаписываются и как мне это исправить? дляисточник большинства проблем "мой вывод выглядит смешно".

0 голосов
/ 13 декабря 2018

С awk, так как вы попробовали это, не могли бы вы попробовать следующее.Добавьте | column -t к следующему коду на случай, если вам понадобится вывод в форме с разделителями табуляции.

awk '
/[a-zA-z]+[0-9]+/{
  print val OFS $0
  val=""
  next
}
NF{
  val=(val?val OFS:"")$0
}
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 $0          ##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:"")$0    ##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.
...