Intereting Posts
X висит после спящего режима Fedora 18 Emacs – Изменение областей show-paren-mode Есть ли способ использовать выражения регулярных выражений для автоматического заполнения имен файлов в bash? Proc stdin странное поведение Как использовать интегрированную Intel и выделенную графику nVidia для питания разных мониторов? Быстрый способ отображения размера каждого подкаталога в каталоге вырезать строку на последнем разделителе Как запустить скрипт с использованием SSH с удаленного компьютера и избежать его прерывания, если удаленный компьютер отключен Почему подстановка командной строки здесь считается одной строкой? find delete shows "Нет такого файла или каталога" Ограничить кеш-память, используемую командой bash – ведение последних версий каталогов отключить ssh, но поддерживать функцию scp для пользователя Использование цикла bash для запуска программы, которая использует одинарные кавычки в командной строке, где одинарные кавычки сводят на нет намерения сценария bash Есть ли файл для каждого сокета?

Поиск символа из столбца

У меня есть цепочка (|) разделенная строка, мне нужно найти первый куттер в 7-м столбце этой строки, разделенной каналом

AAAAAA|04|XXXXXXX|20170210-163119|||2.0|20170208|| 

Ожидаемый результат: 2

Это сделает работу:

 awk -F "|" '{print(substr($7,1,1))}' input.file.txt 

Вы также можете использовать cut:

 cut -d\| -f7 | cut -c1 

удар

 IFS='|' read -r -ax <<< "$str" echo "${x[7]:0:1}" 

команда read использует содержимое $ str и разделяет их на pipe | char и заполняет их в массив ( -a ) с именем x. Затем мы извлекаем один символ из начала 7-го поля.

Perl

 perl -F'\|' -pale '($_) = $F[6] =~ /./g' <<< "$str" 

-F => разделитель полей, -p => автопринт, -a => автосплит включен, -l => настройте разделитель записи ( RS ) на \n и ORS на \n .

7-е поле $F[6] оценивается в контексте списка и как /./g и возвращает отдельные символы, из которых первый /./g и сохраняется в $_ который из-за autoprint будет принимать его в stdout .

Expr

 sep='|' fld="[^$sep]*" fld7=$(yes "$fld$sep" | sed 7q | tr -d '\n') expr "$str" : "$fld7\(.\)" 

Здесь мы строим команду так, чтобы expr свою работу under the hood .

echo "$fld"; # => [^|]* echo "$fld"; # => [^|]* echo "$fld7"; # => [^|]*[^|]* echo "$fld7"; # => [^|]*[^|]* …. 7 раз

Используя python3 , предполагается , что столбец 7 существует во всех строках файла :

 python3 -c "[print(l.split('|')[6][0]) for l in open('f').readlines()]" > 2 

Где 'f' – это (полный) путь к файлу, в одинарных кавычках.

объяснение

 open('f').readlines() 

будет читать файл на строку и

 s.split('|')[6][0] 

разделит линию на делиметр | , а затем напечатать первый символ 7-го столбца (где 0 – индекс первого столбца)

Изучить интересное поведение sed

 sed 's/\(\([^|]\?\)[^|]*|\)\{7\}.*/\2/' input.file.txt 

или для уменьшения утечки

 sed -r 's/(([^|]?)[^|]*\|){7}.*/\2/' input.file.txt 

или чтобы избежать регулярного выражения

 sed '/\n/{s/./\n/2;P;d;};s/|/\n/6;s/$/\n/;D' input.file.txt 

Это может помочь:

 awk -F'[|.]' '{print $7}' filename.txt