从一个位置开始将多个行中的长字符串包装起来

时间:2016-07-05 23:48:02

标签: linux file shell awk

我有一个看起来像这样的文件:

import pygame

我必须得到以下输出:

FirstSentences1  bfjkjhdfhizhfzibfkjezfzfiuzehfizdjfldfsdfsljfklj
SecondSentences2 fjlskdjfjoijrgeojrgijgoejrgrjgiorjofgjeirjgoergd
.
.
.
NthhhSentencesN  klkdlffjsldfsljflsfjlskfjldkjflsfjlfkdjfdfjojjij

说明:

例如第一行:

FirstSentences1  bfjkjhdfhizhfzibfkje
FirstSentences1  zfzfiuzehfizdjfldfsd
FirstSentences1  fsljfklj
SecondSentences2 fjlskdjfjoijrgeojrgi
SecondSentences2 jgoejrgrjgiorjofgjei
SecondSentences2 rjgoergd
.
.
.
NthhhSentencesN  klkdlffjsldfsljflsfj
NthhhSentencesN  lskfjldkjflsfjlfkdjf
NthhhSentencesN  dfjojjij

我们取字符串“bfjkjhdfhizhfzibfkjezfzfiuzehfizdjfldfsdfsljfklj”,当长度等于20时我们将它包裹起来

你知道一种方法吗?

3 个答案:

答案 0 :(得分:2)

使用substr

awk '{ for(i=0;i<length($2);i=i+20) print $1,substr($2,i,20) }' file

答案 1 :(得分:2)

您可以使用字符串索引和嵌套循环使用短脚本执行此操作:

#!/bin/bash

declare -i len=${2:-20}     ## take length as 2nd arg (filename is 1st)

while read -r line; do      ## read each line
    while [ ${#line} -gt 0 ]; do            ## if characters remain
        printf "%s\n" "${line:0:$((len))}"  ## print len chars
        line="${line:$((len))}"             ## strip len chars from line
    done
done < "$1"

示例输入文件

$ cat dat/longsent.txt
bfjkjhdfhizhfzibfkjezfzfiuzehfizdjfldfsdfsljfklj
fjlskdjfjoijrgeojrgijgoejrgrjgiorjofgjeirjgoergd

示例使用/输出

默认 20-chars每行包装:

$ bash wrap.sh dat/longsent.txt
bfjkjhdfhizhfzibfkje
zfzfiuzehfizdjfldfsd
fsljfklj
fjlskdjfjoijrgeojrgi
jgoejrgrjgiorjofgjei
rjgoergd

以每行10个字符包装:

$ bash wrap.sh dat/longsent.txt 10
bfjkjhdfhi
zhfzibfkje
zfzfiuzehf
izdjfldfsd
fsljfklj
fjlskdjfjo
ijrgeojrgi
jgoejrgrjg
iorjofgjei
rjgoergd

注意:您应该验证len是否大于0,并且可以将|| test -n "$line"添加到第一个while子句以适应非POSIX行在最后一行结束(为简洁起见省略)。

包括行前缀

如果您的数据文件包含前缀(例如FirstSentence1...),并且您需要在输出中包含这些前缀,则只需在{{1}之前添加prefix的读数在每个换行之前输出line(有一些合理的字段宽度,左对齐)。 e.g:

prefix

示例输入文件带前缀

#!/bin/bash

declare -i len=${2:-20}     ## take length as 2nd arg (filename is 1st)
declare -i wdth=22          ## set min field width for prefix (so cols align)

while read -r prefix line; do      ## read each line
    while [ ${#line} -gt 0 ]; do   ## if characters remain
        ## print len chars w/prefix width set to wdth, left-justified
        printf "%-*s %s\n" $wdth "$prefix" "${line:0:$((len))}"
        line="${line:$((len))}"    ## strip len chars from line
    done
done < "$1"

示例使用/输出

$ cat dat/longsentpfx.txt
FirstSentence1   bfjkjhdfhizhfzibfkjezfzfiuzehfizdjfldfsdfsljfklj
SecondSentences2 fjlskdjfjoijrgeojrgijgoejrgrjgiorjofgjeirjgoergd

如果您还有其他问题,请与我们联系。

注意:要将宽度设置为超过最长$ bash wrap.sh dat/longsentpfx.txt FirstSentence1 bfjkjhdfhizhfzibfkje FirstSentence1 zfzfiuzehfizdjfldfsd FirstSentence1 fsljfklj SecondSentences2 fjlskdjfjoijrgeojrgi SecondSentences2 jgoejrgrjgiorjofgjei SecondSentences2 rjgoergd $ bash wrap.sh dat/longsentpfx.txt 10 FirstSentence1 bfjkjhdfhi FirstSentence1 zhfzibfkje FirstSentence1 zfzfiuzehf FirstSentence1 izdjfldfsd FirstSentence1 fsljfklj SecondSentences2 fjlskdjfjo SecondSentences2 ijrgeojrgi SecondSentences2 jgoejrgrjg SecondSentences2 iorjofgjei SecondSentences2 rjgoergd 的一个字符,您需要在实际编写包裹的行之前读取所有prefix值以查找最长的宽度,然后添加prefix。如果您的数据文件很短,您可以将前缀和行读入一对索引数组并首先扫描前缀数组中的长度,如果数据文件很大,则可以扫描文件两次(不是最佳),或者你可以设置一些预定的宽度,如上所述。

答案 2 :(得分:1)

举个例子,你可以这样做:

addstr(line.c_str());