根据字符位置读取文件内容

时间:2018-07-11 17:43:32

标签: linux bash

如果我的文件包含以下句子:

I like apples and oranges

but I hate broccoli

我该如何将文件中的以下字符串存储到变量:

ut I hate broc

我尝试使用mycut=$(cut -c 2-15 file),但这是从文件(mycut == "I like apples a ut I hate broc")的两行开始切入的。我只想从该特定行中获取那些特定字符位置的字符串。有什么办法可以做到这一点?

如果有比使用cut更好的方法,那也可以。

4 个答案:

答案 0 :(得分:1)

这是AWK的有效解决方案:

 awk 'BEGIN{ lineIwant = 2; beginChar = 1; finalChar = 3}{ if( NR ==lineIwant ) { print substr($0,beginChar,finalChar)}}' file.txt

致谢!

答案 1 :(得分:1)

为此,剪切命令具有-c选项,您可以通过head -n | tail -1指定行:

echo "I like apples and oranges
But i hate broccoli" |head -2|tail -1|cut -c 2-15

结果:

ut i hate broc

答案 2 :(得分:1)

.then()是你的朋友。

sed

我正在使用$: cat x I like apples and oranges but I hate broccoli $: l=3 $: s=1 $: r=14 $: sed -nE "$l { s/^.{$s}(.{$r}).*/\\1/; p; q; }" x ut I hate broc 来抑制不需要的输出,并使用-E表示扩展表达式。双引号允许我嵌入变量,因此我可以为line($ l),skip($ s)和repeat($ r)尝试不同的值。

我告诉它只在第-n 行上使用,使用s ///删除前导和尾随数据,然后打印该行并退出。 $l对所有命令进行分组,因此其他任何一行都不会发生。

答案 3 :(得分:1)

在这里您会发现几行Awk行,这些行可能有助于获取文本文件的信息。

计算字符/单词/行/句/段落:

awk '{n++}END{print n}' file                             # lines
awk '{n+=NF}END{print n}' file                           # words
awk '{n+=length($0)}END{print n}' file                   # characters    
awk 'BEGIN{RS=""}{n++}END{print n}' file                 # paragraphs
awk 'BEGIN{RS="";FS="[.?!]+"}{n+=NF}END{print n}' file   # sentences

检索第n个字符/单词/行/句/段落:

awk '(NR==n){print; exit}' file                             # line
awk 'BEGIN{RS=""}(NR==n){print;exit}' file                  # paragraph
awk 'BEGIN{c=n}(c-NF<=0){print $c; exit}{c-=NF}' file       # word
# character
awk 'BEGIN{c=n}(c-length($0)<=0){print substr($0,c,1); exit}{c-=length($0)}' file
# sentence
awk 'BEGIN{RS="";FS="[.?!]+";c=n}(c-NF<=0){print $c; exit}{c-=NF}' file

在第p行中检索第n个字符/单词:

awk '(NR==n){print $p; exit}' file               # word
awk '(NR==n){print substr($0,p,1); exit}' file   # character

p行的n中检索所有字符/单词:

awk '(NR==n){print substr($0,p); exit}' file                            # character
awk '(NR==n){for(i=p;i<NF;++i) printf $i OFS;print $NF; exit}' file     # word

在第p行中检索qn中的字符/单词:

awk '(NR==n){print substr($0,p,q-p+1); exit}' file #character
# word
awk '(NR==n){for(i=p;i<(q>NF?q:NF);++i) printf $i OFS; print $(q>NF?q:NF);exit}

检索段落p中的字符qn

awk 'BEGIN{RS="";FS="\n"}(NR==n){print substr($0,p,q-p+1); exit}' file

检索第p段中的第n个字符/单词/句子:

# character
awk 'BEGIN{RS=""}(NR==n){print substr($0,p,1); exit}'
# word
awk 'BEGIN{RS=""}(NR==n){gsub(/\n/," ",$0);print $p; exit}' file
# sentence
awk 'BEGIN{RS="";FS="[.?!]+";c=n}(NR==n){print $p; exit}' file