我有一个带有3个列的TSV制表符分隔文件:
ID\tTEXT\tTYPE
要打印TYPE
列
cat /dataset.csv | awk -F $'\t' '{print $3}'
这些值是诸如{CLASS_A,CLASS_B,CLASS_C}
等的值的枚举。
与枚举中的每个值匹配时,我需要使用AWK的内联方式来计算列的出现次数(NF
?),TYPE
以获取:
CLASS_A 1300
CLASS_B 450
CLASS_C 988
[更新]
根据下面的解决方案,我将这个脚本的最新版本放在这里
#!/bin/bash
COL=$1
FILE=$2
awk -v col="$COL" -F $'\t' ' {c[$col]++}
END{
for (i in c) printf("%s\t%s\n",i,c[i])
}' $FILE
并且计算第3列中的行出现次数的用法是
$ ./count_cols.sh 3 /myfile.csv
无需使用cat
来读取文件。AWK非常有能力阅读它。
核心c[$3]++
语句应获取每种类型的行数。
然后,最后,只需打印(作为制表符分隔的值)所有计数:
#!/bin/bash
awk -F '\t' ' {c[$3]++}
END{
for (i in c) printf("%s\t%s\n",i,c[i])
}' dataset.csv
鉴于OP的评论:
对于带有引号的列,我会遇到一些问题,
that doesn\'t mean that you\'re not worth remembering think of the people who need to know they need to know so you need to show....
在这种情况下,对\ t的解析将失败。
我要复习答案。我创建了这个文件:
$ cat dataset.csv
1233 that doesn\'t mean that you\'re not worth remembering think of the people who need to know they need to know so you need to show... CLASS_0
1234 here CLASS_A
1235 goes the values CLASS_B
1236 "that need counting" CLASS_B
1237 "\like \this" CLASS_B
1238 \or \this CLASS_C
1239 including spaces CLASS_B
1240 but not tabs CLASS_A
1241 which could not work CLASS_B
1242 finally CLASS_C
1243 this is CLASS_A
1244 over CLASS_B
1245 988 CLASS_C
与脚本一起使用时,该文件将给出正确的结果:
$ ./script
CLASS_A 3
CLASS_B 6
CLASS_C 3
CLASS_0 1
这是正确的结果。
当然是档案
tabs
3个字段的正确数量,并且要测试文件是否符合第一个要求,可以使用以下脚本:
#!/bin/bash
filetoread="$2"
<"$filetoread" tr -dc '\t\n' |
awk '(length!=2){printf("Error in line: %s, has %s tabs\n",NR,length)}'
awk -F '\t' '(NF!=3){printf("Error in line: %s, has %s fields\n",NR,NF)}' "$filetoread"
哪个检查每行是否有两个制表符,以及
字段的数量(如awk所示)实际上是三个。
添加一些测试行:
… …
1239 including spaces CLASS_B
1 but not tabs CLASS_A
2 but not \ttabs CLASS_A
1240 but not tabs CLASS_A
… …
并运行上面的脚本:
$ ./script 3 dataset.csv
Error in line: 8, has 4 tabs
Error in line: 8, has 5 fields
检测具有四个选项卡(添加了两个选项卡)的行ID 1,并且没有被带有的行ID 2所欺骗\t
。
至于引用和使用变量,那是您应该自己改善的事情。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句