Перенаправьте фильтрованный вывод в файл

Я перенаправляю свой вывод в файл, и я получаю что-то вроде этого:

|  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. Но я не имею никакого контроля над циклом. Вероятно, информация может уже быть фильтрована во время повторения. Но это довольно сомнительно.

4
задан 18 October 2016 в 01:32

6 ответов

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    |
6
ответ дан 23 November 2019 в 11:35

Можно передать вывод по каналу через этот sed команда:

sed '1p;/^|/!d;/^|\s*id/d'

Объяснение:

  • выражение 1p просто повторяет первую строку.
  • выражение /^|/!d удаляет любую строку, не начинающуюся |.
  • выражение /^|\s*id/d удаляет любую строку, начинающуюся |, затем некоторые (или ни один) пробельные символы, сопровождаемые id. Мы уже распечатали наш заголовок с помощью первого выражения, таким образом, все в порядке, что это выражение отбрасывает его теперь.
5
ответ дан 23 November 2019 в 11:35
your_command | grep "|"

избавится от тех (2 строки) и пустая строка. Можно добавить другой grep-v "идентификатор", который удалит все заголовки, затем просто необходимо добавить один заголовок с командой эха к началу.

1
ответ дан 23 November 2019 в 11:35

Можно использовать sed для печати только материала, который Вы хотите

sed -n '1p; /^|[0-9]/p' file

, Объяснение

-n ничего не печатает, пока мы не просим его
1p, печатают первую строку
^|[0-9]/p, печатают строку, если это запускается с | сопровождаемый номером

3
ответ дан 23 November 2019 в 11:35

Как насчет этого небольшого сценария оболочки? Это использует ответ 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

Сохраняет тот сценарий и дает разрешение выполнения к нему. Для этого сценария нужно имя файла как первый параметр.

1
ответ дан 23 November 2019 в 11:35

Вот немного сценария жемчуга, который можно использовать для этого:

#!/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.

1
ответ дан 23 November 2019 в 11:35

Другие вопросы по тегам:

Похожие вопросы: