Як надрукувати значення в текстовому файлі до колонного файлу за допомогою скрипту оболонки


11

У мене є output.txt із запуску сценарію оболонки наступним чином:

abc.txt
errorstatus1
Fri Nov 11 02:00:09 2016
def.txt
errorstatus2.txt
Sat Nov 12 03:00:09 2016

Текстовий файл має кілька записів рядково за рядком однаково. Я хочу надрукувати ці значення в стовпці: ім'я файлу, статус та часова марка наступним чином:

Filename      Status        Timestamp
abc.txt     errorstatus1   Fri Nov 11 02:00:09 2016
def.txt     errorstatus2   Sat Nov 12 03:00:09 2016

4
Приклад формат - це не файл CSV, це файл з фіксованою колонкою. Ви можете уточнити питання або надати правильний приклад.
AlexP

Ваш приклад - це не формат CVS. Формат CVS є abc.txt,errorstatus1,Fri Nov 11 02:00:09 2016. Я відредагував ваше запитання, щоб відповідати тому, що в ньому написано, на прикладі, який ви подали. Не соромтеся відкочуватись, але зауважте, що вам дійсно потрібно уточнити, що саме ви хочете - стовпчикові значення чи значення, розділені комами
Сергій Колодяжний

Відповіді:


14

З paste:

paste - - - <file.txt

це виведе вміст файлу, розділеного новим рядком у вигляді стовпців, і три стовпчики, розділені на вкладки на рядок.

Додавання заголовка:

echo Filename Status Timestamp; paste - - - <file.txt

Щоб визначити вихід, скористайтеся допомогою column:

{ echo Filename Status Timestamp; paste - - - <file.txt ;} | column -t

Приклад:

% cat file.txt
abc.txt
errorstatus1
Fri Nov 11 02:00:09 2016
def.txt
errorstatus2.txt
Sat Nov 12 03:00:09 2016

% { echo Filename Status Timestamp; paste - - - <file.txt ;} | column -t
Filename  Status            Timestamp
abc.txt   errorstatus1      Fri        Nov  11  02:00:09  2016
def.txt   errorstatus2.txt  Sat        Nov  12  03:00:09  2016

Класно! Спасибі!! Але як надрукувати ці значення у форматі excel. Я хочу, щоб заголовки стовпців на аркуші excel
містили

@ linux09 Створіть CSV та імпортуйте за допомогою Excel:echo Filename,Status,Timestamp; paste -d ',' - - - <file.txt
heemayl

Блискуче! Працює як шарм. Дуже дякую
linux09

6

Ви можете використовувати awk:

awk 'NR % 3 {printf "%s ", $0; next}1'

Вихід може бути не таким гарним:

$ awk 'NR % 3 {printf "%s ", $0; next} 1' input
abc.txt errorstatus1 Fri Nov 11 02:00:09 2016
def.txt errorstatus2.txt Sat Nov 12 03:00:09 2016

Ви можете %s\tзамість цього використовувати для виведення, розділеного на вкладки.

  • NR % 3дорівнює нулю (і помилково) для кожного третього рядка, тому інші рядки друкуються з пробілом після них замість нового рядка. nextтільки починається наступна ітерація.
  • Кожен третій рядок друкується як такий - це через фінал 1, з ним після нового рядка, оскільки він не відповідає першому блоку.

5

Є також rs(BSD r e s hape утиліта):

DESCRIPTION
     rs reads the standard input, interpreting each line as a row of blank-
     separated entries in an array, transforms the array according to the
     options, and writes it on the standard output.  With no arguments it
     transforms stream input into a columnar format convenient for terminal
     viewing.

Зокрема,

     -e      Consider each line of input as an array entry.

Так

$ rs -e < file
abc.txt                   errorstatus1              Fri Nov 11 02:00:09 2016
def.txt                   errorstatus2.txt          Sat Nov 12 03:00:09 2016

або (щоб додати заголовок)

$ { printf '%s\n' Filename Status Timestamp ; cat file ; } | rs -e
Filename                  Status                    Timestamp
abc.txt                   errorstatus1              Fri Nov 11 02:00:09 2016
def.txt                   errorstatus2.txt          Sat Nov 12 03:00:09 2016

3

Для повноти ви також можете це зробити sed:

sed -e '1iFilename\tStatus\tTimestamp' -e 'N;N;y/\n/\t/' file.txt
  • 1iFilename\tStatus\tTimestamp вставляє рядок заголовка перед рядком 1
  • N;N зчитує ще два рядки в буфер шаблону, даючи в цілому 3 рядки з нового рядка
  • y/\n/\t/ замінює всі нові рядки вкладками в буфері шаблонів

В i, Nі ySED команди описані тут .


Чудово .. Не могли б ви також коротко прокоментувати вирази, які ви використовували? Дякую!
Кампа

так, ідеальний чувак
Кампа

1

Завжди можна щось підготувати для обробки тексту за допомогою AWK або Perl, і звичайно Python, що і дає ця відповідь.

Як однолінійний:

python -c 'import sys;print "Filename\tStatus\tTimestamp"; lines=[l.strip() for l in sys.stdin];print "".join([l+"\n" if i%3 == 0 else l+"\t" for i,l in enumerate(lines,1) ])' < input.txt

Як багаторядковий сценарій

import sys
print "Filename\tStatus\tTimestamp"
lines=[l.strip() for l in sys.stdin]
print "".join([l+"\n" if i%3 == 0 else l+"\t" for i,l in enumerate(lines,1) ])

Основна ідея тут полягає в тому, щоб дати введення сценарію через stdin (використовуючи перенаправлення оболонки <, хоча також можна використовувати трубу). Сценарій використовує вкладки для розділення полів, хоча пробіли можуть бути використані і для більш точного налаштування.

Вибірка з використанням прикладу введення, наданого ОП:

$ python -c 'import sys;print "Filename\tStatus\tTimestamp";                                   
> lines=[l.strip() for l in sys.stdin];
> print "".join([l+"\n" if i%3 == 0 else l+"\t" for i,l in enumerate(lines,1) ])' < input.txt
Filename    Status  Timestamp
abc.txt errorstatus1    Fri Nov 11 02:00:09 2016
def.txt errorstatus2    Sat Nov 12 03:00:09 2016
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.