如何使用 shell 脚本将文本文件中的值打印到列文件

lin*_*x09 11 command-line bash scripts text-processing

我有一个来自运行 shell 脚本的 output.txt,如下所示:

abc.txt
errorstatus1
Fri Nov 11 02:00:09 2016
def.txt
errorstatus2.txt
Sat Nov 12 03:00:09 2016
Run Code Online (Sandbox Code Playgroud)

文本文件以相同的方式一行一行地有多个条目。我想将这些值打印到列中:文件名、状态和时间戳,如下所示:

Filename      Status        Timestamp
abc.txt     errorstatus1   Fri Nov 11 02:00:09 2016
def.txt     errorstatus2   Sat Nov 12 03:00:09 2016
Run Code Online (Sandbox Code Playgroud)

hee*_*ayl 14

paste

paste - - - <file.txt
Run Code Online (Sandbox Code Playgroud)

这会将换行符分隔的文件内容输出为列,每行输出三个制表符分隔的列。

添加标题:

echo Filename Status Timestamp; paste - - - <file.txt
Run Code Online (Sandbox Code Playgroud)

要对输出进行列化,请从column以下方面获取帮助:

{ echo Filename Status Timestamp; paste - - - <file.txt ;} | column -t
Run Code Online (Sandbox Code Playgroud)

例子:

% cat file.txt
abc.txt
errorstatus1
Fri Nov 11 02:00:09 2016
def.txt
errorstatus2.txt
Sat Nov 12 03:00:09 2016

% { echo Filename Status Timestamp; paste - - - <file.txt ;} | column -t
Filename  Status            Timestamp
abc.txt   errorstatus1      Fri        Nov  11  02:00:09  2016
def.txt   errorstatus2.txt  Sat        Nov  12  03:00:09  2016
Run Code Online (Sandbox Code Playgroud)


mur*_*uru 6

你可以使用 awk:

awk 'NR % 3 {printf "%s ", $0; next}1'
Run Code Online (Sandbox Code Playgroud)

输出可能不那么漂亮:

$ awk 'NR % 3 {printf "%s ", $0; next} 1' input
abc.txt errorstatus1 Fri Nov 11 02:00:09 2016
def.txt errorstatus2.txt Sat Nov 12 03:00:09 2016
Run Code Online (Sandbox Code Playgroud)

您可以改用 %s\t制表符分隔的输出。

  • NR % 3每第三行为零(并且为假),因此其他行在它们之后打印一个空格而不是换行符。next刚刚开始下一次迭代。
  • 由于 final 1,每第三行按原样打印,后面有一个换行符,因为它与第一个块不匹配。


ste*_*ver 5

还有rs(BSD [R Ë小号高原肺水肿实用程序):

DESCRIPTION
     rs reads the standard input, interpreting each line as a row of blank-
     separated entries in an array, transforms the array according to the
     options, and writes it on the standard output.  With no arguments it
     transforms stream input into a columnar format convenient for terminal
     viewing.
Run Code Online (Sandbox Code Playgroud)

特别是,

     -e      Consider each line of input as an array entry.
Run Code Online (Sandbox Code Playgroud)

所以

$ rs -e < file
abc.txt                   errorstatus1              Fri Nov 11 02:00:09 2016
def.txt                   errorstatus2.txt          Sat Nov 12 03:00:09 2016
Run Code Online (Sandbox Code Playgroud)

或(添加标题)

$ { printf '%s\n' Filename Status Timestamp ; cat file ; } | rs -e
Filename                  Status                    Timestamp
abc.txt                   errorstatus1              Fri Nov 11 02:00:09 2016
def.txt                   errorstatus2.txt          Sat Nov 12 03:00:09 2016
Run Code Online (Sandbox Code Playgroud)