反转文件中的每隔一行,写入unix中的新文件

时间:2015-05-18 18:44:35

标签: python perl unix awk terminal

假设我有一个文件,wassup.txt其行如下:

wassup
donut
skateboard
? teeth. !

我想从第二行开始反转每一行的字符,然后保存为新文件pussaw.txt,其行可读:

wassup
tunod
skateboard
! .hteet ?

理想情况下,解决方案只使用基本终端/ Unix函数,或者awk,perl或python。

我知道我可以用代码翻转每一行:

rev wassup.txt > pussaw.txt

问题是如何只在第二行开始的每一行都执行此操作。

5 个答案:

答案 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