1

csvファイルがあります。フィールドの1つ、たとえば2番目のフィールドでは、そのフィールドの最大文字数を知る必要があります。たとえば、次のファイルがあるとします。

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

行3の2番目のフィールドは8文字であるため、答えは8になります。これをbashスクリプトに統合したいので、一般的なUNIXコマンドラインプログラムをお勧めします。コマンドが何をしているのかを説明するための想像上のボーナスポイント。

編集:これが私がこれまでに持っているものです

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

これにより、1つだけでなく、すべてのフィールドの文字数がわかるので、まだ進歩があります。

4

5 に答える 5

2

私はawkその仕事に使うでしょう。カンマを使用してフィールドの行を分割し、各行について、2番目のフィールドの長さがすでに保存されている値よりも大きいかどうかを確認します。

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

私の解決策は、行をループすることです。カンマを新しい行と交換して単語をループするよりも、最長の単語を確認してデータを保存します。

#!/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 に答える
1

さて@oob、あなたは基本的にあなたの最後の編集で答えを提供しました、そしてそれは与えられたすべての答えの中で最も単純です。ただし、AWKを楽しんでいるという理由だけで、@Bireiの回答も気に入っています。:-)

今日、私もテキストファイル内の特定のフィールドで可能な限り長い値を見つける必要がありました。サンプルでテストし、期待される8を取得しました。

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

ご覧のとおり、正しいオプションを使用するだけですwc(これは、すでに理解していると思います)。

于 2014-01-27T23:17:56.157 に答える
0

BashおよびCoreutilsソリューション

これを解決する方法はいくつかありますが、私は単純さに投票します。Bashパラメータ拡張といくつかの標準シェルユーティリティを使用して各行を測定するソリューションは次のとおりです。

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 に答える