如何使用列格式化单行?

Luc*_*ulz 5 command-line shell sed columns

我在文件phonebook.dat 中有一个基本的电话簿。

$ cat phonebook.dat
Onkh,Gregor:0123456789
Steinert,Franz:02473894091
Rubrecht,Magdalena:01474653371
Run Code Online (Sandbox Code Playgroud)

然后我可以使用格式化该文件column

$ column -t -s ",:" phonebook.dat
Onkh      Gregor     0123456789
Steinert  Franz      0247389409
Rubrecht  Magdalena  01474653371
Run Code Online (Sandbox Code Playgroud)

但是如果我只想输出文件的一行怎么办?基于页面mancolumn需要一个文件作为其最后一个参数。

我尝试解决这个问题,但使用例如sed替换“,”和“:”会产生不一致的结果,如下所示:

$ sed 's/,/\t/g; s/:/\t/g' telefonbuch.dat
Onkh    Gregor  0123456789
Steinert        Franz   02473894091
Rubrecht        Magdalena       01474653371
Run Code Online (Sandbox Code Playgroud)

如何使用 格式化文件中的单行column

Kus*_*nda 6

如果您column只想格式化单行,则只向实用程序提供单行。下面,我仅格式化示例数据中的第 2 行:

$ sed -n '2p' file | column -s ',:' -t
Steinert  Franz  02473894091
Run Code Online (Sandbox Code Playgroud)

文件名参数column是可选的,如果缺少,实用程序将从标准输入中读取。在上面的管道中,我们使用这个事实来格式化命令的输出sed

您可以使用任何命令从电话簿中提取数据。在这里,我使用awk命令输出Magdalena第二个字段中的条目:

$ awk -F '[,:]' '$2 == "Magdalena"' file | column -s ',:' -t
Rubrecht  Magdalena  01474653371
Run Code Online (Sandbox Code Playgroud)
$ awk -v name="Magdalena" -F '[,:]' '(family != "" && $1 == family) || (name != "" && $2 == name)' file | column -s ',:' -t
Rubrecht  Magdalena  01474653371
$ awk -v family="Rubrecht" -F '[,:]' '(family != "" && $1 == family) || (name != "" && $2 == name)' file | column -s ',:' -t
Rubrecht  Magdalena  01474653371
Run Code Online (Sandbox Code Playgroud)

  • @LucaSchulz 好!请注意,您的 grep 命令将在每行的任何位置搜索 _substring_ `Magdalena`。这可能是您想要的,但它也可能会给出误报,具体取决于文件中的数据以及您正在使用的搜索词的唯一性。我的“awk”命令通过仅与第二个字段中的条目进行字符串比较来解决这个问题(假设我们知道“Magdalena”是我们只想在该字段中搜索的名称)。 (2认同)