2017-02-02 6 views
0

У меня есть файл, состоящий из строк данных, где столбцы заданы заданным разделителем.Вставьте столбец с escape-символами в Bash

например.

20170202,ABC,USD,USD,100,20170202 
20170202,ABC,GBP,USD,200,20170202 
20170201,ABC,NOK,USD,300,20170204 
20170131,ABC,DKK,USD,400,20170202 

Я хотел бы способ печати строки этого файла, в котором, например, столбец 1 является 20170202 и колонка 4 USD. В то же время я хочу окружить эти столбцы на распечатанном выходе экранами escape, чтобы выделить их пользователю.

Таким образом, в приведенном выше примере, только строки 1 и 2 должны быть напечатаны, и:

  • колонка 1 (но не столбец 6) должны быть выделены
  • колонка 4 (но не столбец 3) следует будет выделено

В настоящее время у меня есть прикованный grep для каждого переданного аргумента.

например.

cat myfile.txt | grep -w "20170202" | grep -w "USD" 

Это переправлена ​​в SED заявление, в котором колодки 20170202 и USD с символами эвакуационных окрашивать выход.

Однако в приведенном выше примере это не будет выполнено для строки 4, так как оно будет ошибочно выводиться с выделенным столбцом 4 и столбцом 6. Он также терпит неудачу для строки 1, для которой будут выделены столбцы 1, 3, 4 и 6 (когда мне нужны только 1 и 4).

Может ли кто-нибудь посоветовать, как это сделать для произвольного выбора столбцов?

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

ответ

1

В awk вы можете заменить поля как цветные поля. Ниже скрипт должен сделать работу

# cat 42000109 
1. 20170202,ABC,USD,USD,100,20170202 
2. 20170202,ABC,GBP,USD,200,20170202 
3. 20170201,ABC,NOK,USD,300,20170204 
4. 20170131,ABC,DKK,USD,400,20170202 

# awk -v FS=" |," '$2=="20170202" && $4=="USD"{$2="\033[1;31m"$2"\033[1;39m";$4="\033[1;31m"$4"\033[1;39m";print}' 42000109 

1. 20170202 ABC USD USD 100 20170202 
#fields 2 and 4 will be highlighted 

Дополнительные советы по Баш цветов, проверьте [ this ] ссылку.

Редактировать

Если цифры в начале не существует, то ниже материал должен сделать

# awk -v FS=',' -v OFS=',' '$1=="20170202" && $4=="USD"{$1="\033[1;31m"$1"\033[1;39m";$4="\033[1;31m"$4"\033[1;39m";print}' 42000109 
20170202,ABC,USD,USD,100,20170202 
20170202,ABC,GBP,USD,200,20170202 
# #fields 1 and 4 will be highlighted 
+0

К сожалению, 1. 2. 3. 4. В начале каждой строки просто уточнить. Они не существуют в фактическом файле. Как ваш ответ меняется, учитывая это? – Seraph

+0

@Seraph: см. Редактирование. – sjsam

+1

Благодарим за помощь – Seraph

-2
cat text file| awk -F "," '$1 ~ /20170202/ && $3 == "USD" { print }' 

awk занимает в разделителем запятой «» для настоящего файла и разделяет их, к которым можно получить доступ через $ 1, $ 2, $ 3 и так далее. Таким образом, мы можем попытаться проверить, соответствует ли соответствие для $ 1 и $ 3 по мере необходимости. Соотношение $ 1 выполняется через регулярное совпадение, которое выполняется через оператор ~, а строка регулярных выражений сохраняется с косой чертой /.

+0

Хотя этот фрагмент кода может решить вопрос, включая объяснение * how * и * why * Это решает проблему [действительно помогло] (// meta.stackexchange.com/q/114762), чтобы улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, а не только на человека, который спрашивает сейчас! Пожалуйста, отредактируйте свой ответ, чтобы добавить объяснение, и укажите, какие ограничения и допущения применяются. –

0

с использованием СЕПГ (немного трудно читать со всеми теми \) а

sed -e '/^\(20170202\)\(,\([^,]*,\)\{3\}\)\(USD\)\(,.*\)/!d' -e 's//\\\1\\\2\\\4\\\5/' YourFile 

# OR into a more generic form 
sed -e '/^\('${YourDate}'\)\(,\([^,]*,\)\{3\}\)\('${YourCurrency}'\)\(,.*\)/!d' -e 's//\\\1\\\2\\\4\\\5/' YourFile 

AWK версия

awk '$1=="20170202"&&$4=="USD"{$1="\\"$1"\\";$4="\\"$4"\\";print}' FS=',' OFS=',' YourFile 

же, более общий, с комментарием (используя переменную для пакетирования)

awk -v MyDate="{YourDate}" -v MyCur="${YourCurrency} ' 
    # Parameter assign some variable with external value of script 

    # if first field (col) = the date AND 4th field = Currency 
    $1 == MyDate && $4 == MyCur { 
     # replace field 1 by itself surrounded by escape char 
     $1 = "\\" $1 "\\" 
     # same for field 4 
     $4 = "\\" $4 "\\" 

     # Print line (with new content) 
     # default output is modified by OFS value adapted (default is space separator between field and set to , in this script) 
     print 
     } 
    # assign 2 varible (FS and OFS for field separator as input and output) 
    # before reading first availble file (YourFile) 
    ' FS=',' OFS=',' YourFile 
1

Рассмотрим построение карты цветов вы хотите, а затем использовать его, например .:

$ cat tst.awk 
BEGIN { 
    n = split("\ 
     red  31 \ 
     green 32 \ 
     reset 39 \ 
      ", tmpA) 
    for (i=1; i<=n; i+=2) { 
     colors[tmpA[i]] = ("\033[1;" tmpA[i+1] "m") 
    } 
    FS=OFS="," 
} 

function color(field,clr) { 
    $field = (colors[clr] $field colors["reset"]) 
} 

($1=="20170202") && ($4=="USD") { 
    color(1,"red") 
    color(4,"green") 
} 

{ print } 

$ awk -f tst.awk file | cat -v 
^[[1;31m20170202^[[1;39m,ABC,USD,^[[1;32mUSD^[[1;39m,100,20170202 
^[[1;31m20170202^[[1;39m,ABC,GBP,^[[1;32mUSD^[[1;39m,200,20170202 
20170201,ABC,NOK,USD,300,20170204 
20170131,ABC,DKK,USD,400,20170202 
+0

Это чрезвычайно переделано для того, что я просил. Ответ sjsam был достаточным, и я считаю, что это было уже правильно, когда это было опубликовано. Спасибо, в любом случае (был неправильный пользователь, так что его пересчитали) – Seraph

+1

Нет ничего плохого в предоставлении другого ответа после того, как он будет отмечен как правильный. Принятый ответ иногда просто ошибочен (не в этом случае) и часто не самый лучший. Этот форум предназначен для людей, которые ищут ответы на вопросы, а не для того, чтобы предоставить вам ответ на ваш конкретный вопрос, поэтому, хотя вы можете обнаружить, что это чрезмерно спроектировано для вашего конкретного примера, оно обеспечивает общее решение общей проблемы, с которой вы сталкиваетесь описаны и учитывают, что большинство людей сводят к минимуму их реальную проблему при публикации вопроса, поэтому общее решение часто предпочтительнее минимального решения. –

+1

'^ 1 Хороший, хорошо ответ тоже –

 Смежные вопросы

  • Нет связанных вопросов^_^