如何在键名后提取包含空格或引号的键值

时间:2014-02-07 05:52:16

标签: linux bash

假设我的文件包含以下数据,如书名和作者,请注意书名不包含任何空格。例如file.txt如下

book1 john
book2 srikar valiya
book3 adi ularam
book4 neina

从上面的脚本我只想要作者名称所以为此我已经制作了以下脚本

#!/bin/bash


printf "Auther\n=========\n"


grep book1 file.txt | awk  '{print $2}'
grep book2 file.txt | awk  '{print $2}'
grep book3 file.txt | awk  '{print $2}'
grep book4 file.txt | awk  '{print $2}'

给我输出像

Author
=========
john
srikar
adi
neina

但我想要

Author
=========
john
srikar valiya
adi  ularam
neina

我的脚本中还需要一个改进,例如我已经写了4 grep语句来提取作者姓名(目前只有4个可用),但如果文件中有超过100行而文件中的书名不同,那该怎么办呢? (对我来说,检查文件中有多少行并写grep和行grep一样多{{1}}是不可能的,因为名称包含任何模式)

有人有想法吗?

4 个答案:

答案 0 :(得分:2)

您可以改为使用cut

grep book1 file.txt | cut -d" " --complement -f1

答案 1 :(得分:2)

而不是awk '{print $2}'尝试cut -d' ' -f2-

答案 2 :(得分:1)

i=1
while :; do
    line=$(grep "book$i" input) || break
    name=$(sed 's/[^ ]* //' <<< $line)
    echo "$name"
    let i++
done

如果你不知道这本书的名字,但确定每行都包含一本书:

while read line; do
    name=$(sed 's/[^ ]* //' <<< $line)
    echo "$name"
done < input

答案 3 :(得分:1)

这个awk应该可以解决这个问题:

awk '{$1=""; sub(/^ */, "");}1' file
john
srikar valiya
adi ularam
neina