我将以下TSV和换行符字符串分配给bash中的变量:
TAGS Product3 qwerty text Desc3
TAGS Product1 qwerty text Desc1
TAGS Product2 qwerty text Desc2
我想将最后一列提取到一个新字符串,它必须是我的产品输入订购的产品,例如:
Product1,Product2,Product3
必须输出:Desc1,Desc2,Desc3
实现这一目标的最佳方法是什么?
答案 0 :(得分:1)
echo "$tsv_data" | awk '{print $2 " " $5}' | sort | awk '{print $2}' | paste -sd ',' -
按顺序执行以下步骤:
将产生以下输出:
Desc1,Desc2,Desc3
答案 1 :(得分:0)
这是一个我认为应该这样做的功能:
get_descriptions() {
local tsvstring="$1"
local prodnames="$2"
local result=()
# read tsv line by line, splitting into variables
while IFS=$'\t' read -r tags prodname val1 val2 desc || [[ -n ${prodname} && -n ${desc} ]]; do
# check if the line matches the query, and if, append to array
if grep -iq "${prodname}" <<< "${prodnames}"; then
result+=("${desc}")
fi
done <<< "${tsvstring}"
# echo the result-array with field separator set to comma
echo $(IFS=,; echo "${result[*]}")
}
然后你可以像使用它一样:
get_descriptions "${tsv_string_var}" "product1,product2"
答案 2 :(得分:0)
echo "$var" | sort -k2 tags | cut -f5 | paste -sd,
答案 3 :(得分:0)
sort
+ awk
+ paste
管道:
echo "$tsv" | sort -nk2 | awk '{print $5}' | paste -sd',' -
输出:
Desc1,Desc2,Desc3
sort -nk2
- 以数字方式对第二列的输入进行排序
awk '{print $5}'
- 打印出每个第五列
paste -sd','
- 合并,