Как скопировать значение из одного столбца в другой? - PullRequest
0 голосов
/ 23 апреля 2019

У меня есть данные CSV с двумя ценовыми столбцами. Если в столбце $ 4 существует значение, я хочу скопировать его в столбец $ 3 той же строки. Если $ 4 пусто, то $ 3 следует оставить как есть.

Ни одна из этих работ:

awk -F',' '{ if (length($4) == 0) $3=$4 }'
awk -F',' '{ if(!length($4) == 0 ) print $4 }'

Это выведет каждую строку с таблицей сэмплов

awk -F',' '{ if(!length($4) == 0 ) print $0 }' inputfile

Это ничего не даст с таблицей образцов

awk -F',' '{ if(length($4) == 0 ) print $3 }' inputfile

Я очистил два моих входных файла, исправил строку заголовка и соединил их, используя sed, awk, sort и join. Теперь у меня есть CSV, который выглядит так:

itemnumber,available,regprice,mapprice
00061,9,19.30,
00061030,31,2.87,3.19
00062,9,15.44,
00062410,2,3.59,3.99
00064,9,15.44,
00066850,29,2.87,3.99
00066871,49,4.19,5.99
00066878,3,5.63,7.99

Мне нужно перезаписать столбец $ 3, если столбец $ 4 в той же строке имеет значение. Конечный результат будет:

itemnumber,available,regprice,mapprice
00061,9,19.30,
00061030,31,3.19,3.19
00062,9,15.44,
00062410,2,3.99,3.99
00064,9,15.44,
00066850,29,3.99,3.99
00066871,49,5.99,5.99
00066878,3,7.99,7.99

Ответы [ 4 ]

2 голосов
/ 23 апреля 2019
$ awk 'BEGIN{FS=OFS=","} (NR>1) && ($4!=""){$3=$4} 1' file
itemnumber,available,regprice,mapprice
00061,9,19.30,
00061030,31,3.19,3.19
00062,9,15.44,
00062410,2,3.99,3.99
00064,9,15.44,
00066850,29,3.99,3.99
00066871,49,5.99,5.99
00066878,3,7.99,7.99
1 голос
/ 23 апреля 2019

Давайте посмотрим на все, что вы пробовали:

  1. awk -F',' '{ if (length($4) == 0) $3=$4 }'

    Это означает, что если длина поля 4 равна нулю, тогда установите поле 3 равным полю 4. Вы не просите awk ничего напечатать, поэтому оно ничего не будет делать. Это напечатало бы кое-что:

    awk -F',' '{ if (length($4) == 0) $3=$4 }{print $0}'
    

    но со всеми разделителями полей, равными пробелу, вы должны были сделать:

    awk 'BEGIN{FS=OFS=","}{ if (length($4) == 0) $3=$4 }{print $0}'
    
  2. awk -F',' '{ if(!length($4) == 0 ) print $4 }'

    Здесь вы утверждаете, что если длина поля 4 равна нулю, не соответствует действительности, выведите поле 4. Поскольку вы упоминаете, что ничего не печатается, это, скорее всего, указывает на то, что в поле 4 у вас есть скрытые символы, такие как CR (см .: Удалить возврат каретки в Unix ) или даже просто пробелы. Вы можете попробовать что-то вроде

    awk -F',' '{sub(/ *\r?$/,""){ if(!length($4) == 0 ) print $4 }'`**
    
  3. awk -F',' '{ if(!length($4) == 0 ) print $0 }' inputfile

    См. 2

  4. awk -F',' '{ if(length($4) == 0 ) print $3 }' inputfile

    Это подтверждает моё подозрение на 2

Мое решение вашей проблемы будет основано на предложении 2 и решении Эда Мортона.

awk 'BEGIN{FS=OFS=","} {sub(/ *\r?/,"")}(NR>1) && ($4!=""){$3=$4} 1' file
0 голосов
/ 23 апреля 2019

пробовал на GNU AWK

awk -F, -vOFS=, '/[0-9.]+/{if($4)$3=$4} {print}' file
0 голосов
/ 23 апреля 2019

Вот код, соответствующий вашим результатам:

awk -F, -v OFS=, '
  NR == 1 
  NR >  1 { 
    if ( $4 == "" ) 
      print $1,$2,$3,$4 
    else 
      print $1,$2,$4,$4 } 
' $*

В прошлом у меня были проблемы с выражениями типа $ 3 = $ 4, поэтому я просто распечатал все поля.

Редактировать: Эд Мортон посрамил меня за то, что я избежал $ 3 = $ 4 без устранения неполадок. Я сделал еще один снимок здесь:

awk -F, -v OFS=, '
  NR == 1 
  NR >  1 { 
    if ( $4 != "" ) 
      $3 = $4
    print 
  }
' $*

Выше приведены те же результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...