首页 > 解决方案 > 如何从bash中的csv中提取值

问题描述

我有一个 csv 文件,其中包含很多行,如下所示。

,appOne      ,na    ,All,       ,All                                 ,All      ,   ,PORTNAME,21500,

我需要在 bash 中最后得到 21500,这是一个进程将在其上启动的端口

csv 文件也有列,我想知道 21500 在哪里

伪代码将是这样的

get columns
split columns by ","
index = find where column = PORT 
get row 
split by ","
if i == index : return value 

有什么建议么 ?

更新:

SKIP,APP    ,REG,ENV,CLST, HST, INST, UID,PRM     ,VAL  ,COMMENTS
    ,appOne ,na ,All,    ,All ,All  ,    ,PORTNAME,21500,

标签: bash

解决方案


临时文件:

SKIP,APP    ,REG,ENV,CLST, HST, INST, UID,PRM     ,VAL  ,COMMENTS
    ,appOne ,na ,All,    ,All ,All  ,    ,PORTNAME,21500,
function field_index() {
  local field_name=$1
  local header

  read -a header
  for ((i = 0 ; i < ${#header[@]} ; i++)); do
    if [[ "${header[$i]}" =~ \s*"${field_name}"\s* ]]; then
      echo $i
      break
    fi
  done
}

port_field_index=$(field_index VAL < temp.csv)

function trim() {
  echo "$1" | xargs echo -n
}

(
  read _ # Skip header
  while IFS=',' read -a row; do
    trim "${row[$port_field_index]}" # Process port somehow
  done
) < temp.csv

推荐阅读