печатать строки столбцами по два

Есть два основных способа решить эту проблему:

  1. Измените команду findтак, чтобы она входила только в интересующие вас каталоги, а затем печатала один символ (, например.x)для каждого найденного файла внутри. Затем подсчитайте количество этого символа, созданного с помощью wc -l. Безопаснее выводить символ, чем путь, поскольку пути в Unix потенциально могут содержать символы новой строки. Это решение немного сложное, так как оно включает использование -pruneдля игнорирования каталогов, которые нам не интересны, или альтернативно ! -path.

  2. Найдите каталоги точно так же, как вы это делали до сих пор, но затем используйте внутристрочный скрипт -для подсчета файлов внутри. Это проще, и то, что я показываю ниже.

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, что установит позиционные параметры для расширенных записей.Количество позиционных параметров доступно как $#, что также является количеством файлов в этом конкретном каталоге.

Связанные:

-2
01.08.2020, 16:04
3 ответа

что-то вроде этого?

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
1
18.03.2021, 23:15

Питон

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

0
18.03.2021, 23:15

Используя конвейер 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 -
1
18.03.2021, 23:15

Теги

Похожие вопросы