在我的文本文件中,一组中有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可能是我最好的选择,但是我不确定如何从这里开始。
答案 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中。然后将这些行粘贴到长行(每个字符串一个)中,然后使用|
作为记录分隔符将其拆分回较短的行。