Мне нужно получить первые 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
sed -r 's/([^|]*\|){9}/&\n/g' a.txt
Пояснение: [^|] Не является |. [^|]*\| Одно поле (без |), за которым следует |. ([^|]*\|){9} 9 полей, за которыми следует |. &\n Заменить соответствующей строкой, за которой следует новая строка.
[^|]
[^|]*\|
|
([^|]*\|){9}
&\n
Я чистый ksh версия:
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 ) )
len=${#str[@]}
(( ii+9 > len )) && max=$(( len-ii ))
element=...
(( element == len-1 )) && bar=''
echo -e "${str[$element]}${bar}\c"
echo
Эта версия также работает с bash.
Попробуйте это:
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||