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)
你可以使用 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
刚刚开始下一次迭代。1
,每第三行按原样打印,后面有一个换行符,因为它与第一个块不匹配。还有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)