1

我有一个 csv 文件。在其中一个字段中,比如第二个字段,我需要知道该字段中的最大字符数。例如,给定以下文件:

adf,jlkjl,lkjlk
jf,j,lkjljk
jlkj,lkejflkj,adfafef,
jfje,jj,lkjlkj
jjee,eeee,ereq

答案是 8,因为第 3 行的第二个字段中有 8 个字符。我想将其集成到 bash 脚本中,因此首选常见的 unix 命令行程序。用于解释命令正在做什么的想象加分。

编辑:这是我到目前为止所拥有的

cut --delimiter=, -f 2 test.csv | wc -m

这给了我所有字段的字符数,而不仅仅是一个,所以我还有进步。

4

5 回答 5

2

我会用awk这个任务。它使用逗号分隔字段中的行,并为每一行检查第二个字段的长度是否大于已保存的值。

awk '
    BEGIN { 
        FS = "," 
    } 
    { c = length( $2 ) > c ? length( $2 ) : c } 
    END { 
        print c 
    }
' infile

将其用作单行并将返回值分配给变量,例如:

num=$(awk 'BEGIN { FS = "," } { c = length( $2 ) > c ? length( $2 ) : c } END { print c }' infile)
于 2012-07-05T19:52:00.133 回答
1

好吧@oob,您基本上在上次编辑时提供了答案,这是给出的所有答案中最简单的。但是,我也喜欢@Birei 的回答,因为我喜欢 AWK。:-)

今天,我也必须在文本文件中找到给定字段的最长可能值。用您的样品进行了测试,得到了预期的 8。

cut -d, -f2 test.csv | wc -L

如您所见,只需使用正确的选项即可wc(我希望您现在已经想到了)。

于 2014-01-27T23:17:56.157 回答
1

我的解决方案是遍历线路。比我用新行交换逗号来循环单词,而不是检查哪个是最长的单词并保存数据。

#!/bin/bash

lineno=1
matchline=0
matchlen=0
for line in $(cat input.txt); do
        words=`echo $line | sed -e 's/,/\n/g'`
        for word in $words; do
#               echo "line: $lineno; length: ${#word}; input: $word"
                if [ $matchlen -lt ${#word} ]; then
                        matchlen=${#word}
                        matchline=$lineno
                fi
        done;
        lineno=$(($lineno + 1))
done;

echo max length is $matchlen in line $matchline
于 2012-07-05T19:55:57.783 回答
0

Bash 和 Coreutils 解决方案

有很多方法可以解决这个问题,但我投票赞成简单。这是一个使用 Bash 参数扩展和一些标准 shell 实用程序来测量每一行的解决方案:

cut -d, -f2 /tmp/foo |
while read; do
    echo ${#REPLY}
done | sort | tail -n1

这里的思路是拆分CSV文件,然后使用隐式REPLY变量的参数长度扩展来测量每一行的字符。当我们对测量值进行排序时,排序输出的最后一行将保存找到的最长行的长度。

于 2012-07-06T23:11:06.477 回答
0
  1. 剪下所需的列
  2. 打印每行长度
  3. 对行长进行排序
  4. 获取最大线长

cut -d, -f2 test.csv | awk '{print length($0);}' | sort -n | tail -n 1

于 2017-04-05T02:57:18.993 回答