偶数行を奇数行の先頭に移動する方法を探しています。

偶数行を奇数行の先頭に移動する方法を探しています。

次のように、すべての偶数行をすべての奇数行の先頭に移動する方法を見つけようとします。

今後:

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

関連情報