如何使用awk或sed将少量行转换为列

3 unix linux awk sed tr

我想将一些数据连续地添加到当前列的侧栏中.列的块1和块2由新行分隔.我该怎么做.

Cat filename
aaa
bbb
ccc
ddd

eee
fff
ggg
hhh


cat desiredFile
aaa eee
bbb fff
ccc ggg
ddd hhh
Run Code Online (Sandbox Code Playgroud)

Win*_*ute 5

有很多方法.使用bash,paste和GNU sed的简单方法是

paste -d ' ' <(sed '/^$/Q' filename) <(sed '0,/^$/d' filename)
Run Code Online (Sandbox Code Playgroud)

这里

  • sed '/^$/Q' filename 打印文件中的所有行直到第一个空行
  • sed '0,/^$/d' filename 在第一个空行后打印所有行
  • <() 是一个特定于bash的进程替换,它扩展为可以从中读取命令输出的管道名称(以便它可以用作输入文件名),以及
  • paste -d ' ' file1 file2以您描述的方式将两个文件粘贴在一起(由于空格分隔-d ' ';没有该选项,它将使用选项卡)

或者你可以使用awk:

awk -v RS="" -F '\n' 'NF > n { n = NF } { for(i = 1; i <= NF; ++i) a[i] = a[i] OFS $i } END { for(i = 1; i <= n; ++i) print a[i] }' filename
Run Code Online (Sandbox Code Playgroud)

如果为空RS,则awk将文件拆分为空行中的记录,并将-F '\n'这些记录拆分为换行符中的字段,然后代码为

# remember maximum number of fields encountered
NF > n { n = NF }

# wade through the fields, assemble the output lines from them
{ for(i = 1; i <= NF; ++i) a[i] = a[i] OFS $i }

# in the end, print the assembled lines.
END { for(i = 1; i <= n; ++i) print a[i] }
Run Code Online (Sandbox Code Playgroud)

awk方法的优点是它可以使用两个以上的行块.