Я перенаправляю свой вывод в файл, и я получаю что-то вроде этого:
| id | code | color_code |
-------+------+------------+
|11A00B| 15 | 9129102 |
|11A00C| 16 | 9129103 |
(2 rows)
| id | code | color_code |
-------+------+------------+
|11B00B| 25 | 9129152 |
|11B00C| 36 | 9129162 |
(2 rows)
| id | code | color_code |
-------+------+------------+
|11C00B| 22 | 9129107 |
|11C00C| 9 | 9129108 |
(2 rows)
Как может я преобразовывать его в стиль csv как:
| id | code | color_code |
|11A00B| 15 | 9129102 |
|11A00C| 16 | 9129103 |
|11B00B| 25 | 9129152 |
|11B00C| 36 | 9129162 |
|11C00B| 22 | 9129107 |
|11C00C| 9 | 9129108 |
Для получения первого файла, цикл выполняет и запускает sql сценарии. Все, что я делаю, просто > file
. Но я не имею никакого контроля над циклом. Вероятно, информация может уже быть фильтрована во время повторения. Но это довольно сомнительно.
awk
:
awk 'NR==1; /^\|[0-9]/'
действие по умолчанию в awk
должно распечатать запись
NR==1
соответствия первая запись (строка)
/^\|[0-9]/
соответствия любой рекордный запуск с |
сопровождаемый Примером цифры
:
% cat file.txt
| id | code | color_code |
-------+------+------------+
|11A00B| 15 | 9129102 |
|11A00C| 16 | 9129103 |
(2 rows)
| id | code | color_code |
-------+------+------------+
|11B00B| 25 | 9129152 |
|11B00C| 36 | 9129162 |
(2 rows)
| id | code | color_code |
-------+------+------------+
|11C00B| 22 | 9129107 |
|11C00C| 9 | 9129108 |
(2 rows)
% awk 'NR==1; /^\|[0-9]/' file.txt
| id | code | color_code |
|11A00B| 15 | 9129102 |
|11A00C| 16 | 9129103 |
|11B00B| 25 | 9129152 |
|11B00C| 36 | 9129162 |
|11C00B| 22 | 9129107 |
|11C00C| 9 | 9129108 |
Можно передать вывод по каналу через этот sed
команда:
sed '1p;/^|/!d;/^|\s*id/d'
Объяснение:
1p
просто повторяет первую строку. /^|/!d
удаляет любую строку, не начинающуюся |
. /^|\s*id/d
удаляет любую строку, начинающуюся |
, затем некоторые (или ни один) пробельные символы, сопровождаемые id
. Мы уже распечатали наш заголовок с помощью первого выражения, таким образом, все в порядке, что это выражение отбрасывает его теперь. your_command | grep "|"
избавится от тех (2 строки) и пустая строка. Можно добавить другой grep-v "идентификатор", который удалит все заголовки, затем просто необходимо добавить один заголовок с командой эха к началу.
Можно использовать sed
для печати только материала, который Вы хотите
sed -n '1p; /^|[0-9]/p' file
-n
ничего не печатает, пока мы не просим его
1p
, печатают первую строку
^|[0-9]/p
, печатают строку, если это запускается с |
сопровождаемый номером
Как насчет этого небольшого сценария оболочки? Это использует ответ user596137 с grep
и пишет, что вывод в том файле
#!/bin/bash
FILE=$1
FIRST_LINE=`head -n1 ${FILE}`
INPUT=`cat ${FILE} | grep "|" | grep -v "id"`
echo "$FIRST_LINE" > $FILE; echo "$INPUT" >> $FILE
Сохраняет тот сценарий и дает разрешение выполнения к нему. Для этого сценария нужно имя файла как первый параметр.
Вот немного сценария жемчуга, который можно использовать для этого:
#!/usr/bin/perl
use strict;
use warnings;
my$file="file.txt";
open(IN,"<",$file);
my$head=<IN>;
print $head;
while(<IN>)
{
print $_ if $_=~/^\|\S+/;
}
close IN;
Это распечатает первую строку Вашего входного файла как заголовок и затем цикл по остальной части файла и распечатает строки содержания.
Примечание:
Я предполагаю здесь, что Ваши строки содержания всегда запускаются с символа вертикальной черты, сопровождаемого одной рудой больше непробельных символов (|\S+
). Оставьте меня комментарием если это не так, затем я могу скорректировать regex.