【问题标题】:awk: csv split works, but ignores the last field in the rowawk:csv split 有效,但忽略行中的最后一个字段
【发布时间】:2026-02-04 09:25:01
【问题描述】:

我有一个示例文件,如下所示:

示例.csv

Data_1,0,289,292,293,300,306  
Data_2,0,294,3,306  
Data_3,0,294,305,306  
Data_4,0,294,305,306  

我在上面运行 awk:
scr.sh:

awk -F ',' -v tId="$1" '{for(i=3; i<NF; i++){if($i==tId) print}}' $2

通过调用

./scr.sh 300 Sample.csv  

这很好用,并返回我正好匹配的一行。
UK_4_AB34,0,289,292,293,300,306

原始问题陈述:从第 3 列开始,如果任何列数据与给定的数字匹配,则应打印该行。

但是如果我打电话:

./scr.sh 306 Sample.csv  

这不会给我任何回报!
我仔细检查了 Sample.csv 中的行,并确认任何行上都没有尾随空格。
有什么线索吗?谢谢。

【问题讨论】:

  • awk 字段是从 1 开始的,所以也许 i
  • @jas 完全正确。
  • 是的,我错过了。 i

标签: shell csv awk pattern-matching


【解决方案1】:

这个 awk 将满足您的需求:

awk -F ',' -v tId="$1" '$0 ~ "(^|,)" tId "(,|$)"' file

另外,这个egrep 也可以完成这项工作:

egrep '(^|,)306(,|$)' file

更新:根据您下面的 cmets,您可以使用:

awk -v tId="$1" 'BEGIN{FS=OFS=","} {p=$0; $1=$2=""} $0 ~ "(^|,)" tId "(,|$)"{print p}' file

【讨论】:

  • 对,它会解决他当前的脚本问题,如果相同的值出现在 2 个字段中,他会打印两次。
  • 这也匹配第二列。我不希望这样,它应该从第 3 列开始匹配。如果 Sample.csv 有一行“UK_4_AL2,3,294,305,564”,那么它会选择这一行。它不应该。
  • 好的,现在检查更新的答案,它现在只会从字段 3 开始搜索。
【解决方案2】:

这是解决您问题的简单方法。 假设您的参数存储在一个名为 var 的变量中 即var=$1;

因此运行以下命令以查找文件中的出现

grep -E "^${var},|,${var},|,${var}$" yourfilename

【讨论】:

    最近更新 更多