我需要从管道分隔文件中获取前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
答案 0 :(得分:1)
尝试一下:
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||
答案 1 :(得分:1)
sed -r 's/([^|]*\|){9}/&\n/g' a.txt
说明:
[^|]
不是|。
[^|]*\|
一个字段(无|
),后跟|
。
([^|]*\|){9}
9个字段,每个字段后跟一个|
。
&\n
替换为匹配的字符串,后跟换行符。
答案 2 :(得分:0)
我是纯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[@]}
我们需要知道数组有多长,以便知道要打印多少。(( ii+9 > len )) && max=$(( len-ii ))
这是对ii + 9与长度进行整数比较。如果条件成立,我们将使用较低的值更新max。element=...
我们需要ii + jj元素,因此我们在这里计算值。(( element == len-1 )) && bar=''
您最后没有杠。为了避免打印条形图,我们使用了一个条形图变量,该变量在完成后将变为空。echo -e "${str[$element]}${bar}\c"
在这里,我们将该元素与bar变量一起打印。 \ c表示不要以换行符结束打印。必须使用-e才能使\ c工作。echo
由于我们没有为每个元素获取换行符,因此,由于我们有9个元素,因此需要将其淘汰。此版本也适用于bash。