从管道定界文件中检索字段行

时间:2018-11-09 16:48:54

标签: bash shell unix

我需要从管道分隔文件中获取前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 :(得分: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[@]}我们需要知道数组有多长,以便知道要打印多少。
  • 在for外循环中,您希望查看以9为一组的值。这一次遍历数组9。
  • 为避免结束,我创建了一个变量max,该变量将保存当前行上有多少个元素。我们猜测为9,然后根据需要对其进行更新。
  • (( ii+9 > len )) && max=$(( len-ii ))这是对ii + 9与长度进行整数比较。如果条件成立,我们将使用较低的值更新max。
  • 内部for循环,我们在其中逐步浏览线的元素。
  • element=...我们需要ii + jj元素,因此我们在这里计算值。
  • (( element == len-1 )) && bar=''您最后没有杠。为了避免打印条形图,我们使用了一个条形图变量,该变量在完成后将变为空。
  • echo -e "${str[$element]}${bar}\c"在这里,我们将该元素与bar变量一起打印。 \ c表示不要以换行符结束打印。必须使用-e才能使\ c工作。
  • echo由于我们没有为每个元素获取换行符,因此,由于我们有9个元素,因此需要将其淘汰。

此版本也适用于bash。