如何交换每一行中的奇数词和偶数词?

如何交换每一行中的奇数词和偶数词?

我有一个 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

上面是用 Raku(Perl 编程语言家族的成员)编写的答案。简而言之:使用逐行非自动打印标志raku在命令行调用。-ne当使用-ne-pe命令行标志时,每行都会加载到$_,又名 Raku 的“主题变量”($_也是 Perl 中的“主题变量”)。前导.点是简写形式,$_.表示后面的方法将应用于$_主题变量 。连续的方法与点运算符链接在一起.,每个方法依次转换输入数据。

查看这些方法:我们看到逐行输入在空格上被分解为words,然后rotor一起形成单词对(即2提供了参数 )。该函数的名称rotor可能有点晦涩,但我猜它意味着数据对象的各个元素被循环或rotor编辑并分组/聚集在一起。在 -ing 之后,使用和应用的函数rotor对每对进行单独寻址。最后,输出打印为.mapreverseput

请注意,上面的代码(使用rotor默认值)将在末尾删除任何“不完整的元素集”。要在最后保留“不完整的元素集”,请更改调用rotor以添加 Truepartial参数,或使用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)中剪切两个前导元素,翻转它们,然后附加到输出数组(@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

相关内容