如何将半行分成两列?

问题描述 投票:1回答:8

我想改变文章,剪切半行,粘贴成两列。

line1 Ipsum dignissimos doloribus
line2 Sit odio placeat
line3 Consectetur quia
line4 Elit adipisicing
line5 Adipisicing modi
line6 Adipisicing quae
line7 Consectetur tempore
line8 Adipisicing elit
line9 Dolor nam
line10 Dolor esse
line11 Elit amet
line12 Amet quos recusandae  

目标:

line1 Ipsum dignissimos doloribus     line7 Consectetur tempore
line2 Sit odio placeat                line8 Adipisicing elit 
line3 Consectetur quia                line9 Dolor nam 
line4 Elit adipisicing                line10 Dolor esse
line5 Adipisicing modi                line11 Elit amet 
line6 Adipisicing quae                line12 Amet quos recusandae 

请用awk或vim简单介绍一下。

enter image description here

我尝试使用vim:

1.move cursor at the 7th line.
2.6dd
3.add many spaces at the end of each line
    %s/$/                         /
4.gg 
5.move cursor at the middle of the first line
6.ctrl+v
7.6g and down-side arrow
8.I
9.paste content in 0 regitor.
    ctrl+r+0

失败,无法得到我想要的东西。 enter image description here

vim awk
8个回答
1
投票

要在Vim中完成此操作,您可以使用尾随空格填充第一行,然后转到第7行并输入以下键序列:

<c-v>05j$dgg$p

解释(<c-v>代表Ctrl-v):

<c-v>05j$dgg$p
<c-v>                      " Enter visual-block mode
     0                     " Move to beginning of line
      5j                   " Move 5 lines below
        $                  " Move to last character of line
         d                 " Delete visual selection
          gg               " Move to first line
            $p             " Paste text at the end of the line

另外在Vim的命令行中输入它(光标应该在第7行):

:exe "norm \<c-v>05j$dgg$p"

8
投票

pr是您正在寻找的命令。像这样使用它:

pr -t2 file.txt

-t省略了标题。 -2意味着两列。


3
投票

@ hek2mgls pr解决方案显然是要走的路,但是如果你因为某种原因需要使用awk,那么那就是:

$ awk '
    { a[NR]=$0; c=length($0); w=(c>w?c:w) }
    END { m=int((NR+1)/2); for (i=1;i<=m;i++) printf "%-*s\t%-s\n", w, a[i], a[m+i] }
' file
line1 Ipsum dignissimos doloribus       line7 Consectetur tempore
line2 Sit odio placeat                  line8 Adipisicing elit
line3 Consectetur quia                  line9 Dolor nam
line4 Elit adipisicing                  line10 Dolor esse
line5 Adipisicing modi                  line11 Elit amet
line6 Adipisicing quae                  line12 Amet quos recusandae

1
投票

你可以使用splitpaste,例如:

split -l 6 file.txt parts

这将创建2个文件,每个文件有6行

然后使用paste创建一个split输出的新文件:

paste parts* > file.txt

根据您的示例,它将生成如下内容:

line1 Ipsum dignissimos doloribus       line7 Consectetur tempore
line2 Sit odio placeat  line8 Adipisicing elit
line3 Consectetur quia  line9 Dolor nam
line4 Elit adipisicing  line10 Dolor esse
line5 Adipisicing modi  line11 Elit amet
line6 Adipisicing quae  line12 Amet quos recusandae

为了在线之间建立空间,您可以使用expand例如:

paste parts* | expand -t 20

它将返回:

line1 Ipsum dignissimos doloribus       line7 Consectetur tempore
line2 Sit odio placeat                  line8 Adipisicing elit
line3 Consectetur quia                  line9 Dolor nam
line4 Elit adipisicing                  line10 Dolor esse
line5 Adipisicing modi                  line11 Elit amet
line6 Adipisicing quae                  line12 Amet quos recusandae

现在使用vim中的这个你可以使用:

:!split -l 6 % /tmp/parts; paste /tmp/parts* | expand -t 20 > %; rm /tmp/parts*

1
投票

...或使用rs( — reshape a data array )

$ cat file | rs
line1 Ipsum dignissimos doloribus  line7 Consectetur tempore
line2 Sit odio placeat             line8 Adipisicing elit
line3 Consectetur quia             line9 Dolor nam
line4 Elit adipisicing             line10 Dolor esse
line5 Adipisicing modi             line11 Elit amet
line6 Adipisicing quae             line12 Amet quos recusandae  

1
投票

准备:添加空格以使第一行在范围(1,6行)中最长。在正常模式下,7gg

<c-v>6j$dgg$p
<c-v>                      " Enter visual-block mode
      6j                   " Move 5 lines below
        $                  " Move to last character of line
         d                 " Delete visual selection
          gg               " Move to first line
            $p             " Paste text at the end of the line

0
投票

如果你不是在寻找输出序列应该与Input_file的序列相同,那么下面的内容可能对你有帮助。

awk -v line=$(wc -l < Input_file) '{val=FNR==((line/2)+1)||FNR==1?1:++val;a[val]=a[val]?a[val] OFS $0:$0} END{for(i in a){print a[i]}}'  Input_file

编辑:现在也添加一种非单线形式的解决方案。

awk -v line=$(wc -l < Input_file) '
{
  val=FNR==((line/2)+1)||FNR==1?1:++val;
  a[val]=a[val]?a[val] OFS $0:$0}
END{
  for(i in a){
    print a[i]}
}
'  Input_file

如果你想在Input_file本身进行更改,那么在上面的代码中追加以下> temp_file && mv temp_file Input_file


0
投票

我的解决方案涉及将寄存器从linewise更改为blockwise和压缩空间。

fun! GiveItaNameYouWant()
    let @+=''
    7
    normal "+d}
    call setreg('+',@+,'b')
    normal gg
    execute "normal! A \<esc>"
    execute "normal! \"+p"
    %s/  \+/ /g
endfun

如果将此功能复制到剪贴板,则可以这样使用:

:@+ Enter
:call GiveItaNameYouWant() Enter

在我的情况下,如果你不想删除它,我将使用行%s/ \+/ /g删除多余的空格。

© www.soinside.com 2019 - 2024. All rights reserved.