我有一个 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
对每对进行单独寻址。最后,输出打印为.map
reverse
put
请注意,上面的代码(使用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);'
答案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