仅在不包含字符的情况下,追加然后删除一行到另一行

时间:2019-01-27 20:51:12

标签: linux bash awk sed grep

在我的文本文件中,一组中有6行,由两行空行分隔。我已经将每一行的行号打印到了文本文档中。

    365:--------------------------------------------------------------------------------
    366:--------------------------------------------------------------------------------
    367:--------------------------------------------------------------------------------
    368:--------------------------------------------------------------------------x-----
    369:--------------------4-----------------------------------------------------------
    370:--0-----------------------------------------------------------------------------
    371:
    372:
    373:--------------------------------------------------------------------|
    374:--------------------------------------------------------------------|
    375:------------0--------2--------3h----2h----0-----2-------------------|
    376:---2-----------------------------------------------------2----------|
    377:--------------------------------------------------------------------|
    378:--------------------------------------------------------------------|

当前只有80个字符被打印到一行,因此其余数据将在下一组中继续。例如,第365行对应于第373行。

对于仅不包含竖线的行(即365-370行),我尝试1)追加8行以外的行,然后2)在打印后添加的行删除。

所以,理想情况下:

    365:----------------------------------------------------------------------------------------------------------------------------------------------------|
    366:----------------------------------------------------------------------------------------------------------------------------------------------------|
    367:--------------------------------------------------------------------------------------------0--------2--------3h----2h----0-----2-------------------|
    368:--------------------------------------------------------------------------x--------2-----------------------------------------------------2----------|
    369:--------------------4-------------------------------------------------------------------------------------------------------------------------------|
    370:--0-------------------------------------------------------------------------------------------------------------------------------------------------|

我可以使用grep隔离不包含竖线的行

grep -vn \| song.txt

我知道SED或AWK可能是我最好的选择,但是我不确定如何从这里开始。

4 个答案:

答案 0 :(得分:2)

只需按摩这种方法以适合西装:

$ seq 16 | awk 'NR>8{print a[NR%8], $0} {a[NR%8]=$0}'
1 9
2 10
3 11
4 12
5 13
6 14
7 15
8 16

例如假设在您输入的末尾有2个空行,使其成为8行的块:

$ awk 'NR>8{print a[NR%8] $0} {a[NR%8]=$0}' file
--------------------------------------------------------------------------------------------------------------------------------------------------|
--------------------------------------------------------------------------------------------------------------------------------------------------|
------------------------------------------------------------------------------------------0--------2--------3h----2h----0-----2-------------------|
-------------------------------------------------------------------------x-------2-----------------------------------------------------2----------|
-------------------4------------------------------------------------------------------------------------------------------------------------------|
-0------------------------------------------------------------------------------------------------------------------------------------------------|

或者如果您在最后一块之后没有空白行:

$ awk '!NF{next} ++cnt>6{print a[NR%6] $0} {a[NR%6]=$0}' file
--------------------------------------------------------------------------------------------------------------------------------------------------|
-------------------------------------------------------------------------x------------------------------------------------------------------------|
-------------------4----------------------------------------------------------------------0--------2--------3h----2h----0-----2-------------------|
-0-------------------------------------------------------------------------------2-----------------------------------------------------2----------|
--------------------------------------------------------------------------------------------------------------------------------------------------|
--------------------------------------------------------------------------------------------------------------------------------------------------|

答案 1 :(得分:0)

有点丑陋,但可以正常工作

拆分输入:

egrep -v "^$|\|" song.txt >file1
egrep    "\|"    song.txt >file2

并将其放在一起:

paste -d "" file1 file2

答案 2 :(得分:0)

我通常将vim程序用于此类工作。例如,假设您有一个名为file_name.txt的文件,其中包含以下内容

-------------------------8----
------------0--------2--------|
---2--------------------------|
------------------aaa---------|

---------------984asds--------|
---------t6776----------------|

使用以下命令

vim -c ":6y" -c ":put" -c ":1" -c ":join!" -c ":6d" -c ":wq" file_name.txt

程序在第一行打开file_name.txt,复制第六行,粘贴复制到第二行(下一行)中的内容,转到第一行,将第一行与第二行连接,删除复制的行(第六行),保存并关闭文件。这样,此命令将产生以下结果

-------------------------8-------------------984asds--------|
------------0--------2--------|
---2--------------------------|
------------------aaa---------|

---------t6776----------------|

答案 3 :(得分:0)

这可能对您有用(GNU utils);

sed '/^$/d' file |
split -nr/6 --filter 'cat'|
paste -sd'\0'|
sed 's/|/&\n/g;s/\n$//'

这将使用sed删除所有空白行,使用循环方法将文件分割为6,而不是制作单独的文件,而是将所有交错的文件输出到stdout中。然后将这些行粘贴到长行(每个字符串一个)中,然后使用|作为记录分隔符将其拆分回较短的行。