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文字替换水平空白&。完成后,只需打印字段。