我试图仅在另一列(称为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列为监视列。
如果有人有任何想法,我将不胜感激。
答案 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