寻找将偶数行移动到奇数行开头的方法

寻找将偶数行移动到奇数行开头的方法

我试图弄清楚如何将所有偶数行移动到所有奇数行的开头,如下所示:

前:

AAA
BBB
CCC
DDD

后:

BBBAAA
DDDCCC

我可以一次在多个文件上运行的东西会很棒,因为使用 cat 组合所有文件会产生一个太大而无法处理的文件。类似于以下用于进行文本交换的命令,以便我可以将其添加到 bash 文件中:

  find /directory/. -type f -exec sed -i 's/oldtext/newtext/g' {} \;

我已经搜索过,但没有找到合适的东西。

为了使事情变得更容易,我可以将“string1”添加到所有奇数行的开头,将“string2”添加到所有偶数行的开头,如下所示:

  before:
  string1AAA
  string2BBB
  string1CCC
  string2DDD

  after:
  string2BBBstring1AAA
  string2DDDstring1CCC 

十分感谢。

答案1

忘记带有前缀的想法。您正在寻找的脚本是

sed 'N;s/\(.*\)\n\(.*\)/\2\1/'

也就是说,用 读取下一行N,然后更改顺序并删除换行符。

您可以将其与find您所写的结合起来。首先尝试不带选项-i来测试这是否是您想要的。

答案2

呆呆地解决方案:

for f in /directory/*; do gawk -i inplace '{getline nl; print nl$0}' "$f"; done

for f in /directory/*- 对于指定路径中的每个文件

gawk -i inplace- 使能够到位文件编辑

getline nl- 从 awk 的输入中读取下一条记录到变量中nl(下一行)

print nl$0- 打印当前和下一条交换的记录

答案3

使用 GNU sed

sed '1~2 { h; d; }; G; s/\n//'

awk

awk '{ if(NR%2) save = $0; else print $0 save }'

perl

perl -pe '$_ = <> . $_; s/\n//'

答案4

eval "`echo 'NL=qsq' | tr 'qs' '\047\012'`"; # newline
set -- 
while IFS= read -r l; do
   case $# in
      0 ) set -- "$l" ;;
      * ) printf '%s%s\n' "$l" "$1"; set -- ;;
   esac
done < input.data
printf '%s' ${1+"$1$NL"} # to take care of dangling line

awk '{ if ( NR % 2 ) ORS = $0 RS; else print }' input.data

perl -lpe '$_ = (<>.$_) =~ s/\n//r' input.data

sed -ne '
   ${p;d;}
   h;n;G;s/\n//p
' input.data

结果

BBBAAA
DDDCCC

相关内容