从包含TSV字符串的bash变量中提取特定文本

时间:2017-03-30 22:10:29

标签: bash awk sed grep

我将以下TSV和换行符字符串分配给bash中的变量:

TAGS    Product3    qwerty  text    Desc3
TAGS    Product1    qwerty  text    Desc1
TAGS    Product2    qwerty  text    Desc2

我想将最后一列提取到一个新字符串,它必须是我的产品输入订购的产品,例如:

Product1,Product2,Product3必须输出:Desc1,Desc2,Desc3

实现这一目标的最佳方法是什么?

4 个答案:

答案 0 :(得分:1)

echo "$tsv_data" | awk '{print $2 " " $5}' | sort | awk '{print $2}' | paste -sd ',' -

按顺序执行以下步骤:

  • 打印第二个和第五个参数(产品和描述),它们之间有空格。
  • 使用sort对输入进行排序(如果可以包含数字,则使用gnu-sort)
  • 仅打印说明(每行)
  • 使用粘贴
  • 加入这些行

将产生以下输出:

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',' - 合并,