проверка данных в столбцах, когда данные или некоторые могут отсутствовать или представлять?

клавиша Backspace только перемещает курсор назад.

клавиша Backspace (или удаляют или безотносительно символа в зависимости от конфигурации) удаляет последний печатный символ только, когда эти условия соблюдают:

  • это вводится на клавиатуре, не выводе команды как echo в Вашем примере
  • оконечное устройство находится в режиме с обработкой (обычный случай)

Если Вы хотите стереть c в своем примере, необходимо перезаписать его другим символом, например:

echo "abc^H "
3
12.05.2013, 01:37
3 ответа

Я не знаю, что существует действительно хороший способ восстановить эту информацию, если поля в середине являются пробелом, и Вы позволяете разделителю идти на неуказанное количество символов, как Вы могли когда-либо говорить, что поле, которое Вы заканчиваете тем, что видели, Colour и нет PlayerName ?

В какой-то момент данные должны быть отформатированы способом, который может быть проанализирован программно, и что-либо еще - просто результат плохой подачи данных. Необходимо переключиться на односимвольный разделитель, если Вы хотите смочь пропустить случайные поля.

Если это - проблема удобочитаемости, можно, конечно, написать сценарий презентации данных, где поля увеличены с пробелом, пока они не находятся под надлежащими столбцами, но выполнение так уничтожает информацию, которая сообщила бы, на какое поле Вы на самом деле смотрите, таким образом, это - односторонний процесс.

4
27.01.2020, 21:10
  • 1
    Извините, но это неправильно (и я просто дал upvote для первой части...): Конечно, дополнение пробелом направо передает информацию, какое поле это. awk даже имеет функцию использования просто этого: FIELDWIDTHS. Вы не можете заполнить вкладками и пробелами хотя (или должны преобразовать вкладки сначала). Если бы информация, на какое поле Вы смотрите, закончилась затем, то Вы даже не могли заполнить к правому столбцу: Как был бы Вы знать что правый столбец (или: дополнение права)? Это просто не работает с обычное awk полевой разделительный метод. –  Hauke Laging 11.05.2013, 18:21
  • 2
    я не уверен в использовании ШИРИНЫ ПОЛЯ в awk, но +1 так или иначе ответ, казался хорошо мне. Спасибо @Joel и Hauke –  munish 11.05.2013, 18:25
  • 3
    @HaukeLaging Microsoft, спасибо за информацию. Для моего собственного образования, как был бы FIELDWIDTHS реагируйте на поле, которое увеличено для поддержания столбцов после значения строки, это длиннее, чем заголовок? –  Bratchley 11.05.2013, 20:20
  • 4
    Например, значение Griffin под lname ? –  Bratchley 11.05.2013, 20:21
  • 5
    Ширина поля должна быть продолжительностью самой долгой записи плюс одна (для отделяющегося пространства). Необходимо снять изоляцию с пробелов от значения поля, потому что awk занимает все охваченные позиции (несколько пробелов в этом случае). Взгляните на код в моем ответе, который может быть полезным. Но я узнал из другого ответа об этом FIELDWIDTHS нестандартно (GNU еще раз). –  Hauke Laging 11.05.2013, 21:13
awk -v field="Game" -v FIELDWIDTHS="10 12 10 13 25" '
  NR == 1 {cmpstr="^" field " *$";
    for (i=0;i<6;i++) if ($i ~ cmpstr) { fieldindex=i; next;}; exit 1};
  {gsub(" ","",$fieldindex); if ($fieldindex != "") print $fieldindex;}' inputfile

Редактирование 1: Выход с кодом ошибки, не соответствуя столбцу найден.

Редактирование 2: не производите пустые строки.

3
27.01.2020, 21:10

Вы могли использовать FIELDWIDTHS, хотя это - a gawk расширение и не как портативный. Вы могли также назвать поля как в, например:

awk '
BEGIN {
    FIELDWIDTHS = "10 9 13 11 32"
    team=1; colour=2; game=3; rainfall=4; name=5;
}

NR == 1 {
    next
}
/./ {
    print $3, $name
} ' fixwdata

Ширины в FIELDWIDTHS составлен следующим образом:

  Team      Colour   Game      Rainfall   PlayerName  
  XYZ       Blue     Cricket   Yes        Kapil
# <-  10  -><-  9  -><-  10  -><-  11   -><-     NN      ->  FIELDWIDTHS
#     $1        $2       $3        $4            $5          Field numbers

Дополнительно Вы могли использовать, например, substr (). Если первые уникальные имена синхронизаций строчной развертки, где никакое повторение, т.е. нет Name, TeamName, Вы могли использовать index().

Это выглядит немного хрупким. Если данные являются зафиксированной шириной, Вы могли твердый код это, но некоторые программы также извергают зафиксированную ширину – но также и выравнивают данные согласно ширине данных. Таким образом, Вы могли добраться:

Output1:

FLD1 FLD2
foo  bar

Output2:

FLD1   FLD2
foobaz bar

Этот пример не принимает повторения имен на другие имена:

awk '
function get_fld(fld_name)
{
    return substr($0, col[fld_name"s"], col[fld_name"w"]);
}
BEGIN {
    team=1
    colour=2
    game=3
    rainfall=4
    name=5
}
NR == 1 {
    col["1s"]=0
    col["2s"]=index($0, $2)
    col["3s"]=index($0, $3)
    col["4s"]=index($0, $4)
    col["5s"]=index($0, $5)
    col["1w"]=col["2s"] - 1
    col["2w"]=col["3s"] - col["2s"]
    col["3w"]=col["4s"] - col["3s"]
    col["4w"]=col["5s"] - col["4s"]
    col["5w"]=22
    next
}
/./ {
    printf(\
    "%-5s {\n"\
    "%12s: %s\n"\
    "%12s: %s\n"\
    "%12s: %s\n"\
    "%12s: %s\n"\
    "}\n",
    get_fld(name),
    "Team", get_fld(team),
    "Colour", get_fld(colour),
    "Game", get_fld(game),
    "Rainfall", get_fld(rainfall));
} ' fixwdata

Вход:

Team      Colour   Game         Rainfall   PlayerName  
ABC       Blue     Cricket      Yes        Kapil
DEF       Red      Cricket                 Konos
DEF       Yellow   Go                      Kripl
DUX       Black
Zon       Purple   Golf         No         Gim
Zon       Purple   Golf         No         Jom

Вывод:

Kapil {
        Team: ABC       
      Colour: Blue     
        Game: Cricket      
    Rainfall: Yes        
}
Konos {
        Team: DEF       
      Colour: Red      
        Game: Cricket      
    Rainfall:            
}
Kripl {
        Team: DEF       
      Colour: Yellow   
        Game: Go           
    Rainfall:            
}
      {
        Team: DUX       
      Colour: Black
        Game: 
    Rainfall: 
}
Gim   {
        Team: Zon       
      Colour: Purple   
        Game: Golf         
    Rainfall: No         
}
Jom   {
        Team: Zon       
      Colour: Purple   
        Game: Golf         
    Rainfall: No         
}
3
27.01.2020, 21:10

Теги

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