使用unix shell命令的csv文件字段中的最大字符数?
我有一个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
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流编辑器