Извлечение определенного столбца из CSV-файла на основе другого столбца - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь извлечь значение столбца (назовем его x) только в том случае, если другой столбец (назовем его y) содержит запись, равную 1. Если запись равна 0 (или что-то еще), то яхочу, чтобы это было проигнорировано. Запись в столбце x будет затем записана в файл в определенном формате.

Я пытался использовать while read line и оператор if для этого, но потому что я уже использую while read line в извлечении столбцау значения у меня проблемы с получением его на работу. Как я извлекаю столбец y и сохраняю его в файл, показано.


cut -d "," -f4 $input| sed '1d' | while read line;
do
printf -- "- name: `echo "$line" | tr a-z A-Z`\n  search_string: ['$line']\n  exact_match: False\n" >> output.txt
done

Пример ввода:

host,port,process,monitor
localhost,1000,process1,1
localhost,1001,process2,1
localhost,1002,process3,0

Пример вывода:

- name: PROCESS1
  search_string: ['process1']
  exact_match: False
- name: PROCESS2
  search_string: ['process2']
  exact_match: False

В случае, если этонепонятно столбец x - столбец процесса, а столбец y - ​​столбец монитора.

Буду признателен за любую помощь, если у кого-нибудь возникнут какие-либо идеи.

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Хотя awk, вероятно, будет лучшим выбором для этого приложения, read в bash может считывать несколько переменных одновременно на основе переменной IFS (Internal Field Separator). Кроме того, расширение параметров bash может преобразовываться в верхний регистр со следующим синтаксисом:

foo="process1"
bar=${foo^^}  # convert all characters to upper case
echo $bar     # prints "PROCESS1"

В вашем примере должно работать следующее:

cut -d "," -f3,4 "$input" | sed '1d' | while IFS=, read procname flag; do
  if [[ "$flag" == "1" ]]; then
    printf -- "- name: ${procname^^}\n  search_string: ['$procname']\n  exact_match: False\n"
  fi
done

И его можно урезать еще больше:

sed '1d' "$input" | while IFS=, read -r host port procname flag; do
  [[ "$flag" == "1" ]] && printf -- "- name: ${procname^^}\n  search_string: ['$procname']\n  exact_match: False\n"
done
0 голосов
/ 29 октября 2019
awk -F, -v input="$input" '$4==1 && $3==input{
     printf "name: %s\nsearch_string: [%s]\nexact_match: False\n", toupper($3), $3 }' input.csv

Приведенный выше «awk-oneliner» дает следующий вывод, если у вас есть значение «process1» в переменной оболочки $input. Вы можете изменить значение $input, чтобы получить другие результаты.

name: PROCESS1
search_string: [process1]
exact_match: False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...