从bash中以空格分隔的CSV文件中查找特定单元格

从bash中以空格分隔的CSV文件中查找特定单元格,bash,csv,Bash,Csv,我有一个与bash操作逗号分隔值文件(.csv)相关的问题,该文件以空格作为选定的分隔符保存 作为一个例子,我将在这里放置一个小的.csv文件: A B C D 1 a b c d 2 e f g h 3 i j k l 4 m n o p 这是我的问题:在bash中是否可以读取特定的值,例如从C4单元读取 试图找到任何具有类似问题的主题,但无法找到 提前谢谢 在awk中可以很容易地做到这一点: 示例。sh #!/bin/bash

我有一个与bash操作逗号分隔值文件(.csv)相关的问题,该文件以空格作为选定的分隔符保存

作为一个例子,我将在这里放置一个小的.csv文件:

   A  B  C  D  
1  a  b  c  d   
2  e  f  g  h  
3  i  j  k  l  
4  m  n  o  p 
这是我的问题:在bash中是否可以读取特定的值,例如从C4单元读取

试图找到任何具有类似问题的主题,但无法找到


提前谢谢

在awk中可以很容易地做到这一点:

示例。sh

#!/bin/bash

awk '
{
  if(NR==5){ print $4; }
}
' < "$1"

详细信息

  • NR过滤行号
  • $4表示第四个字段(C列下)

在awk中可以很容易地做到这一点:

示例。sh

#!/bin/bash

awk '
{
  if(NR==5){ print $4; }
}
' < "$1"

详细信息

  • NR过滤行号
  • $4表示第四个字段(C列下)

棘手的部分是将
“C4”
转换为
第3列第4行。bash有一种方法:

#!/bin/bash

cell=$1
file=$2

colnum() {
    local -u col=$1
    local val=0 i
    for ((i=0; i<${#col}; i++)); do
        # ascii value of a char, ref: http://stackoverflow.com/q/890262/7552
        printf -v ascii "%d" "'${col:i:1}"
        val=$(( val*26 + ascii - 64 ))
    done
    echo "$val"
}

if ! [[ $cell =~ ^([A-Za-z]+)([0-9]+)$ ]]; then
    echo "error: invalid cell '$cell'"
    exit 1
fi

col=$(colnum "${BASH_REMATCH[1]}")
row=${BASH_REMATCH[2]}
lineno=0

while read -ra fields; do
    if (( ++lineno == row )); then
        echo "${fields[col-1]}"
    fi
done < "$file"
#/bin/bash
单元格=$1
文件=$2
colnum(){
本地-u列=$1
本地val=0 i

对于((i=0;i而言,棘手的部分是将
“C4”
转换为
第3列第4行

#!/bin/bash

cell=$1
file=$2

colnum() {
    local -u col=$1
    local val=0 i
    for ((i=0; i<${#col}; i++)); do
        # ascii value of a char, ref: http://stackoverflow.com/q/890262/7552
        printf -v ascii "%d" "'${col:i:1}"
        val=$(( val*26 + ascii - 64 ))
    done
    echo "$val"
}

if ! [[ $cell =~ ^([A-Za-z]+)([0-9]+)$ ]]; then
    echo "error: invalid cell '$cell'"
    exit 1
fi

col=$(colnum "${BASH_REMATCH[1]}")
row=${BASH_REMATCH[2]}
lineno=0

while read -ra fields; do
    if (( ++lineno == row )); then
        echo "${fields[col-1]}"
    fi
done < "$file"
!/bin/bash
单元格=$1
文件=$2
colnum(){
本地-u列=$1
本地val=0 i

对于((i=0;iCSV文件不是Excel特定的格式。当你说“Excel”时,你会让人们认为你在谈论.xls或.xlsx,这是一个非常不同的问题(对于这些文件,你会想使用Python,它有一些非常好的解析器可用)。也就是说,对于bash,最简单的解决方案稍有不准确,如果单元格中的值带有逗号,则无法正常工作。您知道这里是否可能存在这种情况吗?实际上,我将.csv文件与空格放在一起,因为在我的excel设置中,我可以选择将此文件显示为普通excel文件。我假设没有此设置所有的变量都应该用逗号隔开。你的实际文件将以这种方式保存,所以这不仅仅是为了演示目的?那就行了。(虽然这意味着如果你的任何数据包含空格,我们需要知道它才能给出正确的答案)。您如何生成文件的详细信息需要在问题中;我在这里自己编辑过,但您以后应该这样做。是的,我的所有文件都是这样保存的。谢谢您的观察和建议CSV文件不是Excel特定的格式。当您说“Excel”时,你会让人们认为你在谈论.xls或.xlsx,这是一个非常不同的问题(对于这些,你会想使用Python,它有一些非常好的解析器可用)。也就是说,对于bash,最简单的解决方案稍有不准确,如果单元格中的值带有逗号,则无法正常工作。您知道这里是否可能存在这种情况吗?实际上,我将.csv文件与空格放在一起,因为在我的excel设置中,我可以选择将此文件显示为普通excel文件。我假设没有此设置所有的变量都应该用逗号隔开。你的实际文件将以这种方式保存,所以这不仅仅是为了演示目的?那就行了。(虽然这意味着如果你的任何数据包含空格,我们需要知道它才能给出正确的答案)。关于如何生成文件的详细信息需要讨论;我在这里自己编辑了它们,但您以后应该这样做。是的,我的所有文件都是以这种方式保存的。谢谢您的观察和建议。请使用
…更正以修复建议的冗余io。在csv问题上,通常csv是逗号删除的,al尽管即将发布的RFC规范似乎包含了更通用的分隔符()的使用,但我知道——Python CSV模块支持替代分隔符,但当OP指出它是一个“Excel文件”时,我做出了一个假设(当时是合理的)他们使用了Excel默认的CSV格式。true-Excel有不同的CSV类型(mac、dos)-不知道有什么区别。在这里,我基本上是通过查看输入来假设文件是制表符分隔的。请使用
…更正以修复建议的冗余io。在csv问题上,通常csv是逗号分隔的,尽管即将发布的RFC规范似乎包括使用更通用的分隔符()事实上,我知道——Python CSV模块支持备用分隔符,但当OP指出它是一个“Excel文件”时,我做出了一个假设(当时是合理的),他们使用了Excel默认的CSV格式。true——Excel有不同的CSV类型(mac、dos)-不知道有什么区别。在这里,我基本上是通过查看输入来假设文件是以制表符分隔的