使用unix shell命令的csv文件字段中的最大字符数?

使用unix shell命令的csv文件字段中的最大字符数?,unix,command-line,csv,text-processing,Unix,Command Line,Csv,Text Processing,我有一个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 tes

我有一个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
这为我提供了所有字段的字符计数,而不仅仅是一个,因此我仍有进展。

我将使用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)
我会用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)

我的解决方案是在线路上循环。然后我用新行交换逗号来循环单词,然后检查哪个单词最长并保存数据

#!/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

我的解决方案是在线路上循环。然后我用新行交换逗号来循环单词,然后检查哪个单词最长并保存数据

#!/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
Bash和Coreutils解决方案 有很多方法可以解决这个问题,但我赞成简单。下面是一个使用Bash参数扩展和一些标准shell实用程序来测量每一行的解决方案:

cut -d, -f2 /tmp/foo |
while read; do
    echo ${#REPLY}
done | sort | tail -n1
这里的想法是分割CSV文件,然后使用隐式REPLY变量的值来测量每行上的字符。当我们对测量值进行排序时,排序输出的最后一行将保留找到的最长行的长度。

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

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

这里的想法是分割CSV文件,然后使用隐式REPLY变量的值来测量每行上的字符。当我们对测量值进行排序时,排序输出的最后一行将保留找到的最长行的长度。

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

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

切割-d,-f2测试.csv | wc-L


如您所见,只需为wc使用正确的选项,我希望您现在已经找到了。

Well@oob,您在上次编辑时基本上提供了答案,这是给出的所有答案中最简单的一个。然而,我也喜欢@Birei的答案,因为我喜欢AWK-

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

切割-d,-f2测试.csv | wc-L

正如你所看到的,只是使用正确的wc选项的问题,我希望你现在已经找到了

剪下所需的列 打印每行的长度 对行长度进行排序 抓取最大线长度 cut-d,-f2 test.csv | awk'{print length$0;}'| sort-n | tail-n1

剪下所需的列 打印每行的长度 对行长度进行排序 抓取最大线长度
cut-d,-f2 test.csv | awk'{print length$0;}'| sort-n | tail-n1

非常有趣的问题,可以用cut和wc解决。。。“但你需要什么呢?”雷基尔,谢谢,我不知道切的事。这似乎是我需要开始的…你也可以看看awk的流编辑器以及有趣的问题,这可能是解决与削减和wc。。。“但你需要什么呢?”雷基尔,谢谢,我不知道切的事。这似乎是我需要开始的…你也可以看看awk流编辑器