Получить строки поля из файла с разделителями трубы - PullRequest
0 голосов
/ 09 ноября 2018

Мне нужно получить первые 9 слов из файла с разделителями каналов, а затем следующие 9 слов. Любая помощь приветствуется.

cat a.txt
a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|

cat new.ksh
#! /bin/ksh
a=`awk -F "|" ' { print NF-1 } ' a.txt`
echo $a

Expected Output:
a|b|c|d|e|f|g|h|i|
j|k|l|m|n|o|p|q|r|
s|t|u|v|w|x|y|z

Ответы [ 3 ]

0 голосов
/ 10 ноября 2018
sed -r 's/([^|]*\|){9}/&\n/g' a.txt

Пояснение: [^|] Не является |.
[^|]*\| Одно поле (без |), за которым следует |.
([^|]*\|){9} 9 полей, за которыми следует |.
&\n Заменить соответствующей строкой, за которой следует новая строка.

0 голосов
/ 10 ноября 2018

Я чистый ksh версия:

IFS='|'
typeset -a str=( $( < a.txt ) )
len=${#str[@]}
bar='|'
for ((ii=0; ii<len; ii+=9))
do
    max=9
    (( ii+9 > len )) && max=$(( len-ii ))
    for ((jj=0; jj<max; jj++))
    do
        element=$(( ii+jj ))
        (( element == len-1 )) && bar=''
        echo -e "${str[$element]}${bar}\c"
    done
    echo
done

Пояснение:

  • IFS: Это внутренний разделитель полей, обычно это пробел и табуляция, но если он переназначен, он разделяет другие типы данных.
  • typeset -a Мы создаем массив для хранения данных.
  • str=( $( < a.txt ) ) Мы читаем данные из массива a.txt как элементы массива.
  • len=${#str[@]} Нам нужно знать, какова длина массива, чтобы мы знали, сколько распечатать.
  • Вне цикла for вы хотите видеть значения в группах по 9. Это пошагово проходит по массиву девять за один раз.
  • Чтобы избежать запуска до конца, я создал переменную max, которая будет содержать количество элементов в текущей строке. Мы предполагаем, что 9, а затем обновили его при необходимости.
  • (( ii+9 > len )) && max=$(( len-ii )) Это целочисленное сравнение ii + 9 с длиной. Если условие истинно, мы обновляем макс с более низким значением.
  • Внутренний цикл, где мы проходим элементы линии.
  • element=... Нам нужен элемент ii + jj, поэтому здесь мы вычисляем значение.
  • (( element == len-1 )) && bar='' У вас не было планки в конце. Чтобы не печатать полосу, мы используем переменную бара, которую мы превращаем в ноль, когда закончим.
  • echo -e "${str[$element]}${bar}\c" Здесь мы печатаем этот элемент вместе с переменной bar. \ C говорит, что не заканчивайте печать новой строкой. -E требуется, чтобы \ c работал.
  • echo Поскольку мы не получили перевод строки для каждого элемента, мы должны выпустить его теперь, когда у нас есть 9 элементов.

Эта версия также работает с bash.

0 голосов
/ 09 ноября 2018

Попробуйте это:

mayankp@mayank:~/$ cat a.txt| tr "|" "\n" |head -9 | tr "\n" "|" > output.txt
mayankp@mayank:~/$ echo  >> output.txt
mayankp@mayank:~/$ cat a.txt| tr "|" "\n" | tail -18|head -9| tr "\n" "|" >> output.txt
mayankp@mayank:~/$ echo  >> output.txt
mayankp@mayank:~/$ cat a.txt| tr "|" "\n" | tail -9 | tr "\n" "|" >> output.txt
mayankp@mayank:~/$ echo  >> output.txt
mayankp@mayank:~/$ cat output.txt 
a|b|c|d|e|f|g|h|i|
j|k|l|m|n|o|p|q|r|
s|t|u|v|w|x|y|z||
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...