假设我有一个文件,wassup.txt
其行如下:
wassup
donut
skateboard
? teeth. !
我想从第二行开始反转每一行的字符,然后保存为新文件pussaw.txt
,其行可读:
wassup
tunod
skateboard
! .hteet ?
理想情况下,解决方案只使用基本终端/ Unix函数,或者awk,perl或python。
我知道我可以用代码翻转每一行:
rev wassup.txt > pussaw.txt
问题是如何只在第二行开始的每一行都执行此操作。
答案 0 :(得分:5)
使用Perl的选项组合oneliner。
perl -lpe '$_ = reverse $_ unless $.%2' file
-l
(小写L)从终止换行中删除并在打印时将其重新添加; -p
导致Perl循环输入行并在运行脚本后打印每个输入行; $_
是当前输入行,$.
是行号。
答案 1 :(得分:4)
这是一个awk解决方案:
awk '
function reverse(s, r) {
for (i=length(s); i>0; i--)
r=r substr (s, i, 1);
return r
}
{
print ((NR%2) ? $0: reverse($0))
}' file
函数reverse()
反转给定的字符串,并且每隔一行调用它。
答案 2 :(得分:1)
简单的Python脚本:
#!/usr/bin/python
import sys
flip = False
for line in sys.stdin:
if flip:
print line.strip()
else:
print line.strip()[::-1]
flip = not flip
另存为,例如flip_evens.py
,然后修复权限(chmod +x flip_evens.py
)并将其作为./flip_evens.py < input.txt
运行。
答案 3 :(得分:1)
在几乎纯粹的bash中,您可以保留一个变量来知道您是在读取偶数行还是奇数行,然后相应地应用rev
:
f=0
while IFS= read -r line
do
(( f%2 )) && rev <<< "$line" || echo "$line"
(( f++ ))
done < file > new_file
打印到stdout:
while IFS= read -r line; do (( f%2 )) && rev <<< "$line" || echo "$line"; (( f++ )); done < a
wassup
tunod
skateboard
! .hteet ?
答案 4 :(得分:1)
这是Python的另一个解决方案:
nul