我有一个文本文件,其中包含以下行:
LIN This is the value which I need
from this line which has a very long line
SHR This1;This2;
This3;
GYC This is an extra.
输出应该是这样的:
LIN This is the value which I need from this line whi a very..
SHR This1;This2;This3;
GYC This is an extra.
sed
在用 Python 实现之前,我先尝试过这个。所以我想出了..
sed 's/ //' filename.txt
上面的代码片段只做了一件事,它删除了空的 4+1 空格(总是固定的),但是现在我不确定如何继续,因为我必须将行移动到 LINE&SHRT 标签,这样我才能提取信息。此外,当标签行(使用 LINE/SHRT/EKY/EKC/USER)继续时,它会由一个额外的空格指示。如果应该是新行,那么它会继续到下一行。
问题,sed 可以用来将行移动到上一行吗?如何区分空白区域以指示线路是继续还是终止
答案1
把事情简单化:
sed 'H;1h;$!d;g;s/\n */ /g'
这个简短的脚本将连接所有以至少一个空格开头的行与上一行。
工作原理:H
将每一行附加到保留空间。为了避免出现前导换行符,第一行将被复制1h
。如果这不是最后一行,d
则将其删除,否则将保留空间移动到带有 的模式空间g
。现在整个文件都在模式空间中,现在该s
命令将所有带空格的换行符替换为一个空格。
使用 GNUsed
你可以让它变得更简单:
sed -z 's/\n */ /g'
答案2
另一种方式AWK
:
awk '{$1=$1;printf("%s ",$0)};NR%2==0{print ""}' FILE.txt
出去:
LIN This is the value which I need from this line which has a very long line
SHR This1;This2; This3;
GYC This is an extra.
$1=$1
: 删除起始行的空格printf("%s ",$0)
从行尾删除\n
( )newline
NR%2==0{print ""}
print\n
(newline
) 对于偶数行(例如:2,4,6,...)
答案3
/^[A-Z]/ { if (line) { print line }; line = $0 }
/^ / { sub(/ /, "") ; line = line $0 }
END { if (line) { print line } }
该awk
脚本将产生
LIN This is the value which I need from this line which has a very long line
SHR This1;This2;This3;
GYC This is an extra.
鉴于问题中提供的数据file.in
。
第一个块将对以大写 ASCII 字符开头的每一行执行。
line
如果里面有内容就会输出 的内容,然后将当前输入的行保存到 中line
。这负责输出前一个输入“块”的构造行,并开始组装下一个输出行。第二个块将对开头至少有一个空格的每一行执行,并将删除前五个空格,然后将其添加到 的末尾
line
。这将从输入中的连续行构建输出行。如果其中有任何内容,该
END
块将输出已保存的内容。line
这负责从输入的最终“块”输出组装行。
你运行这个
$ awk -f script.awk file.in
此脚本处理可能存在多个缩进(连续)行的情况。