use*_*074 5 sed awk perl text-processing cut
我有一个带有|
[pipe] 分隔符的输入字符串,并且喜欢按&
字符替换第 3 列和第 5 列的空字符串。
输入文件:
a a|b b|c c|d d|e e
f f|g g|h h|i i|j j
Run Code Online (Sandbox Code Playgroud)
输出文件:
a a|b b|c&c|d d|e&e
f f|g g|h&h|i i|j&j
Run Code Online (Sandbox Code Playgroud)
您可以看到之间的空格cc, ee, hh and jj
被替换为&
我有一个替代解决方案,该解决方案涉及使用while 循环读取文件并使用cut
基于分隔符的命令并将其存储在基于位置的变量中,并使用“&”替换空格sed
并附加所有拆分的将变量放入一个变量并将其附加到一个新文件中。是否有单个命令可用于实现此目的?
αғs*_*нιη 12
使用awk
此:
awk -F\| '{gsub(" ","\\&",$3); gsub(" ","\\&",$5)}1' OFS=\| infile.txt
Run Code Online (Sandbox Code Playgroud)
的-F\|
,告诉“AWK”那场被分隔|
管(它是由逃脱\
到外壳不把它解释为pipeline stdin
,我们可以使用-F"|"
或两种-F'|'
)。
gsub("regexp","replacement"[, INDEX])
用于在索引(列)和" "
中用文字替换(空格)的语法,下面显示了基于分隔符的每个索引位置。&
$3
$5
|
a a|b b|c c|d d|e e
^^^|^^^|^^^|^^^|^^^
$1 |$2 |$3 |$4 |$5
Run Code Online (Sandbox Code Playgroud)
阅读更多关于我们为什么逃到\\&
那里和两次的信息?!
什么是1
在结束时使用awk '{...}1'
?这是 awk 要打印的默认操作控件。详细阅读
将OFS=\|
再次带回或打印与指定的字段|
分隔符。
你可以做
sed 's/\(|[^| ]*\) */\1\&/4;s//\1\&/2'
Run Code Online (Sandbox Code Playgroud)
对于你的例子。解释:
|[^| ]*
搜索您的字段分隔符和该列中的所有非空格。它与分组在一起,\(\)
以便以后可以将其复制到替换\1
。然后一个或多个空格将被替换为&
,需要在替换字符串中对其进行转义。的4
手段来应用此到第四occurence这是第五列。然后2
对第三列重复它。您不需要通过提供空模式来重复模式。
如果列中可能有多个空格或根本没有空格,则更复杂。然后最好使用不同的工具,如awk
.
另一方面,如果您知道每列中总是有一个空格,请执行一个简单的
sed 's/ /\&/5;s//\&/3'
Run Code Online (Sandbox Code Playgroud)
小智 7
perl -aF'(\|)' -lne 's/\h/&/ for @F[2*2,2*4]; print @F' input_file
Run Code Online (Sandbox Code Playgroud)
a a|b b|c&c|d d|e&e
f f|g g|h&h|i i|j&j
Run Code Online (Sandbox Code Playgroud)
拆分管道上的当前记录,|
并在字段中包含分隔符。因此,第 3 和第 5 个字段变为 2*2 和 2*4 字段。
对于这两个字段,我们用\h
文字替换水平空白&
。完成后,只需打印字段。