Есть два основных способа решить эту проблему:
Измените команду find
так, чтобы она входила только в интересующие вас каталоги, а затем печатала один символ (, например.x
)для каждого найденного файла внутри. Затем подсчитайте количество этого символа, созданного с помощью wc -l
. Безопаснее выводить символ, чем путь, поскольку пути в Unix потенциально могут содержать символы новой строки. Это решение немного сложное, так как оно включает использование -prune
для игнорирования каталогов, которые нам не интересны, или альтернативно ! -path
.
Найдите каталоги точно так же, как вы это делали до сих пор, но затем используйте внутристрочный скрипт -для подсчета файлов внутри. Это проще, и то, что я показываю ниже.
find /path/to/cool/stuff -maxdepth 4 -type d -name "*Magic Data*' \
-exec bash -O dotglob -c '
dir=$1
set -- "$dir"/*
printf "%s %d\n" "$dir" "$#"' bash {} ';'
Здесь мы находим каталоги, как и вы, затем для каждого каталога запускаем этот короткий bash
скрипт:
dir=$1
set -- "$dir"/*
printf "%s %d\n" "$dir" "$#"
Это берет путь к каталогу из командной строки (, заданной find
), и расширяет шаблон глобуса *
внутри него. Установив параметр оболочки dotglob
в командной строке скрипта, мы гарантированно также будем считать скрытые файлы и каталоги (удалить -O dotglob
, чтобы не считать скрытые имена ).
Мы делаем расширение всех имен в качестве аргумента для set
, что установит позиционные параметры для расширенных записей.Количество позиционных параметров доступно как $#
, что также является количеством файлов в этом конкретном каталоге.
Связанные:
что-то вроде этого?
awk '{printf ("%s %s\t", $3, $4)}' file
или, может быть, так для обработки отсутствующих полей
awk '{field3=$3; field4=$4} $3==""{field3="\t"} $4==""{field4="\t"} {printf ("%s %s\t", field3, field4)}' file
Питон
#!/usr/bin/python
import re
m=re.compile(r'\s{1,}')
t=[]
k=open('file.txt','r')
for i in k:
j=re.sub(m," ",i)
try:
o=j.strip().split(' ')
if (len(o) == 4):
y="{0} {1}".format(o[2],o[3])
elif (len(o) == 3):
y="{0}".format(o[2])
else:
print "Number of columns is less than 3"
t.append(y)
except:
pass
print "\t".join(t)
выход
python test.py
435.9 6.04 691.7 27.61 964.5 10.03 1932.5
praveen@praveen:~
$
команда awk
awk '{print $3,$4}' filename| perl -pne "s/\n/\t/g"
435,9 6,04 691,7 27,61 964,5 10,03 1932,5
Используя конвейер awk-paste
, мы печатаем третье и четвертое поля, разделенные одним пробелом, а затем все они помещаются в одну строку с помощью опции paste
-s
, причем каждая пара разделяется символом paste
разделитель по умолчанию TAB=\t
.
$ awk '{print $3, $4}' file | paste -s -
Если мы хотим остаться в пределах awk
, это тоже возможно:
$ awk '
BEGIN { s[1] = "\t"; ORS = "" }
{ print s[(NR>1)] $3, $4 }
END { print RS }
' file
Мы также можем выполнить cut-paste
работу над этим, но перед этим необходимо выполнить небольшое редактирование, а именно преобразовать все пробелы в пробел, сжать несколько пробелов и убрать начальный пробел (, если он есть ). Это связано с тем, что cut
требует один символ в качестве разделителя, а cut не игнорирует начальные разделители.
$ < file sed -Ee 's/\s+/ /g;s/^ //' |
cut -d' ' -f3,4 | paste -s -