各行の奇数単語と偶数単語を置き換える方法は?

各行の奇数単語と偶数単語を置き換える方法は?

あるファイルから奇数文字と偶数文字列を置き換え、別のファイルに保存するbashスクリプトがあります。

#!/bin/bash

infile="inputfile"
outfile="outputfile"

{
while read -r odd && read -r even
do
    echo "$even"
    echo "$odd"
    unset odd
done < "$infile"

# in case there are an odd number of lines in the file, print the last "odd" line read
if [[ -n $odd ]]; then
    echo "$odd"
fi
} > "$outfile"

奇数と偶数を変える方法性格ファイルの各行に?

例:

入力ファイル:

one two three four five six
apple banana cocoa dish fish nuts

結果ファイル:

two one four three six five
banana apple dish cocoa nuts fish

答え1

使用幸せ(以前のPerl_6)

raku -ne 'put .words.rotor(2).map(*.reverse);'  

または

raku -ne '.words.rotor(2).map(*.reverse).put;'

または

raku -ne '.words.rotor(2)>>.reverse.put;' 

入力例:

one two three four five six
apple banana cocoa dish fish nuts

出力例:

two one four three six five
banana apple dish cocoa nuts fish

上記は、Perlシリーズのプログラミング言語であるRakuで書かれた答えです。つまり、raku1行ずつ自動印刷ではなくフラグを使用してコマンドラインから呼び出されます。または、コマンドラインフラグを-ne使用すると、各行はRakuの「テーマ変数」(Perlでは「テーマ変数」とも呼ばれます)とも呼ばれるにロードされます。先行点は、トピック変数に次の方法が適用されることを示す省略形です。連続したメソッドはドット演算子とともに連結され、各メソッドは順番に入力データを変換します。-ne-pe$_$_.$_.$_.

これらの方法を見ると、1行ずつ入力された内容がスペースで区切られ、次に単語のペアwordsrotorまとめられていることがわかります(つまり、2引数が提供されます)。関数名はrotor多少あいまいかもしれませんが、データオブジェクトの個々の要素が繰り返されるかrotor編集され、一緒にグループ化/集計されるという意味になります。 -ing 後、rotor各ペアは使用および適用される機能によって個別に処理されます。最後に、出力は次のように印刷されます。mapreverseput

上記のコード(rotorデフォルトを使用)は、最後の「不完全な要素のセット」を削除します。最後に「不完全な要素セット」を維持するには、呼び出しを変更してrotorTrueパラメータを追加するpartialか、batch同じ意味の次を使用します。

raku -ne 'put .words.rotor(2, partial => True).map(*.reverse);' 

これは次のとおりです。

raku -ne 'put .words.rotor(2, :partial).map(*.reverse);'

これは次のとおりです。

raku -ne 'put .words.batch(2).map(*.reverse);'

https://raku.org

答え2

sed@guest_7が提案したものを提案します。

$ sed -e 's/\([^ ]\+\) \([^ ]\+\)/\2 \1/g' inputfile 
two one four three six five 
banana apple dish cocoa nuts fish

答え3

これを使用するには、perl入力ワード配列(@ F)から2つの先行要素を切り取り、反転して出力配列(@ A)に追加します。

perl -slane 'my @A;
  push @A, reverse splice @F, 0, 2
    while @F > 1;
  print @A, @F;
' -- -,=\  ./yourfile

シェル自体を使用してください。

cat yourfile |
while IFS= read -r l
do
  set -f; set -- $l
  while [ "$#" -gt 1 ]
  do
    printf '%s ' "$2" "$1"
    shift 2
  done
  echo "${1-}"
done

awk '
{
  t=$0;$0="";split(t, a)
  for (i=1; i+1 in a; i+=2) {
    $(i) = a[i+1]
    $(i+1) = a[i]
  }
  if (i in a) $(i) = a[i]
}1
' yourfile

を通じて、python我々はリストスライシングとリスト理解機能を活用します。

python3 -c 'import sys
with open(sys.argv[1]) as f:
  for l in f:
    F = l.strip().split()+[""]
    print(*[f"{b} {a}" for a,b in zip(F[::2],F[1::2])])
' yourfile

答え4

#!/usr/bin/python
k=open('file1','r')
for line in k:
    fina_list=[]
    con=line.strip().split(' ')
    for raco in range(0,len(con),2):
        if (int(raco)%2 == 0):
            odd_cha=con[raco+1]
            even_cha=con[raco]
            con[raco]=odd_cha
            con[raco+1]=even_cha
            fina_list.append(con[raco])
            fina_list.append(con[raco+1])
    print " ".join(fina_list)

出力

two one four three six five
banana apple dish cocoa nuts fish

関連情報