У меня есть файл с разделителями табуляции в Unix, который имеет проблемы с данными

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

  • Первая строка - заголовок.
  • Вторая строка действительна, так как имеет 4 столбца.
  • Третий также действителен (это нормально, если поле описания пусто)

Поле ID и "Боже, благослови меня" Последний столбец PNumber - это не пустые поля.

Как можно видеть, 4-я строка испорчена из-за символа новой строки в "столбце описания", который охватывает несколько строк.

ID  Name    Description Phnumber
1051    John    5674 I am doing good, is this task we need to fix   908342
1065    Rohit               9876246
10402   rob I am    
    doing good, 
    is this task we need to fix     908341
105552  "Julin rob hain"    i know what to do just let me do it     
    "
    "
    "
    "
    "
    " 
908452   1051   Dave    I am doing reporting this week  88889999

Может быть, скриншот поможет увидеть проблему

введите описание изображения здесь

Каждая строка начинается с цифры и заканчивается цифрой. Каждая строка должна иметь 4 столбца.

желаемый результат

ID      Name    Description                                         Phnumber
1051    John    5674 I am doing good, is this task we need to fix    908342
1065    Rohit                                                        9876246
10402   rob   I am doing good, 563 is this task we need to fix       908341
105552  "Julin rob hain" i know what to do just let me do it         908452   
1051    Dave    I am doing reporting this week                      88889999

Данные являются примерами данных, фактический файл имеет 12 столбцов. да, между столбцами может быть число, и лишь немногие являются полями даты (например, 2017-03-02)

2 ответа

Решение

Это сделал трюк

кошка имя_файла | perl -0pe 's/\n(?!([0-9]{6}|$)\t)//g' | perl -0pe 's/\r(?!([0-9]{6}|$)\t)//g' | sed '/^$/d'

awk в помощь!

Предполагается, что все цифровые поля не отображаются, кроме первого и последнего полей

awk 'NR==1; 
     NR>1 {for(i=1;i<=NF;i++) 
             {if($i~/[0-9]+/) s=!s; printf "%s", $i (s?OFS:RS)}}' file


ID  Name    Description Phnumber
1051 John I am doing good, is this task we need to fix 908342
10423 rob I am doing good, is this task we need to fix 908341
1052 Julin rob hain i know what to do just let me do it " " " " " " 908452
1051 Dave I am doing reporting this week 88889999

возможно установить OFS в \t иметь больше структуры

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