Как посчитать символы между вкладками, размер которых превышает 8000 linux - PullRequest
0 голосов
/ 23 марта 2020

У меня есть файл, например, file.dat.gz, разделенный табуляцией.

Например,

hi ^ Iapple ^ Itoast

Можно ли считать между вкладками, используя w c?

Поскольку приведенные выше значения равны 2, 5, 5, w c вернет 0, но если оно будет больше 8000, может ли оно перечислить 1 или точное значение?

Ответы [ 2 ]

0 голосов
/ 24 марта 2020
 awk -F'\t' '{for (i=1; i<=NF;i++) if(length($i)>8000)  print $i}'

Демо

$echo -e "hi\tapple\ttoast" |  awk -F'\t' '{for (i=1; i<=NF;i++) if(length($i)>2)  print $i}' 
apple
toast
$echo -e "hi\tapple\ttoast" |  awk -F'\t' '{print length($1) , length($2) , length($3)}' 
2 5 5
$echo -e "hi\tapple\ttoast"
hi  apple   toast
$echo -e "hi\tapple\ttoast" |  awk -F'\t' '{print length($1) , length($2) , length($3)}' 
2 5 5
$echo -e "hi\tapple\ttoast" |  awk -F'\t' '{for (i=1; i<=NF;i++) if(length($i)>2)  print $i}' 
apple
toast
$
0 голосов
/ 23 марта 2020

Не нужно wc.

Установить $IFS для временной вкладки в строке перед read.
, которая исключит пробелы (c .f. " ab c ").
Читать в массив, и l oop каждый.

Проверьте длину> 8000 и ведите себя соответственно. Вот краткий пример, который вы можете адаптировать.

 $: IFS="   " read -a lst < in
 $: for x in "${lst[@]}"
 >  do l="${#x}"
 >     if (( l > 8000 ))
 >     then x='<too long>'
 >     fi
 >     printf "'%s' = %d\n" "$x" "$l"
 >  done
 'hi' = 2
 'a b c' = 5
 'apple' = 5
 '<too long>' = 10000
 'toast' = 5

Если вы обрабатываете действительно большой файл, запишите его в awk или perl для повышения производительности.

...