根据另一列从{csv文件中提取特定列

时间:2019-10-29 10:38:14

标签: linux bash

我试图仅在另一列(称为y)包含等于1的项的情况下提取列的值(称为x)。如果该条目等于0(或其他值),则我希望它被忽略。然后,将以特定格式将x列的条目写入文件。

我尝试使用while read line和if语句来执行此操作,但是由于我已经在提取列y值中使用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 :(得分:0)

awk -F, -v input="$input" '$4==1 && $3==input{
     printf "name: %s\nsearch_string: [%s]\nexact_match: False\n", toupper($3), $3 }' input.csv

如果在shell变量process1中有值“ $input”,则上面的“ awk-oneliner”给出以下输出。您可以更改$input的值以获得不同的结果。

name: PROCESS1
search_string: [process1]
exact_match: False

答案 1 :(得分:0)

尽管对于该应用程序,awk可能是更好的选择,但是read中的bash可以基于IFS(内部字段分隔符)变量同时读取多个变量。另外,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