【问题标题】:Read words in a specific line in a text file using shell script使用 shell 脚本读取文本文件中特定行中的单词
【发布时间】:2023-04-02 04:39:01
【问题描述】:

在我的 Bash shell 脚本中,我想从文件中读取特定的行;由: 分隔,并将每个部分分配给一个变量以供以后处理。

例如我想读取第 2 行的单词。文本文件:

abc:01APR91:1:50
Jim:02DEC99:2:3
banana:today:three:0

一旦我“读取”了第 2 行,我应该能够像这样回显这些值:

echo "$name";
echo "$date";
echo "$number";
echo "$age";

输出将是:

Jim
02DEC99
2
3

【问题讨论】:

标签: bash shell csv file-processing


【解决方案1】:

为了回显文件的一行,我很喜欢sed

$ IFS=: read name date number age < <(sed -n 2p data)
$ echo $name
Jim
$ echo $date
02DEC99
$ echo $number
2
$ echo $age
3
$

这使用process substitutionsed 的输出传递给read 命令。 sed 命令使用-n 选项,因此它不会打印每一行(默认情况下); 2p 表示“当它是第 2 行时,打印该行”; data 只是文件名。

【讨论】:

  • 顺便说一句,这种技术的一个优点是,如果名称是Jim Kennedy 而不仅仅是Jim,这会在$name 中获得正确的值。其他答案将有问题,Kennedy 是日期,02DEC99 是数字,2 3 是年龄。
  • 对您出色的 -n 2p sed 修饰符很感兴趣,但无法在文档中找到它。找到了这个解释:stackoverflow.com/a/1429628/1207958
  • @svante:我正在练习 DRY——不要重复自己。 :D 我将添加一些 cmets 来解释 sed 命令。
【解决方案2】:

你可以用这个:

read name date number age <<< $(awk -F: 'NR==2{printf("%s %s %s %s\n", $1, $2, $3, $4)}' inFile)

echo "$name"
echo "$date"
echo "$number"
echo "$age"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 2014-02-24
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多