【问题标题】:reverse every other line in a file, write to a new file in unix [closed]反转文件中的每一行,写入unix中的新文件[关闭]
【发布时间】:2015-07-30 09:36:08
【问题描述】:

假设我有一个文件,wassup.txt 其中的行内容为:

wassup
donut
skateboard
? teeth. !

我想将其他每一行的字符颠倒过来,从第二行开始,然后另存为一个新文件pussaw.txt,其内容为:

wassup
tunod
skateboard
! .hteet ?

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

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

rev wassup.txt > pussaw.txt

问题是如何只在每隔一行执行此操作,从第二行开始。

【问题讨论】:

  • 是否允许使用 perl、awk 或 python?
  • @MarkPlotnick 所有这些都很好。
  • @colin 我添加了你说你没问题的标签。
  • 您自己有没有为此付出任何努力?我认为这是一项家庭作业,因为它看起来根本不像商业上有用的东西
  • @Borodin 不是作业问题。它实际上会解决我遇到的一个真正的生物信息学问题。我是一名生态学家,自学编码以处理非常大的 DNA 文件。我自己已经努力做到这一点。还有——你有点粗鲁!

标签: python perl unix awk terminal


【解决方案1】:

使用 Perl 的选项来组装一个 oneliner。

perl -lpe '$_ = reverse $_ unless $.%2' file

-l(小写 L)去掉终止的换行符并在打印时将其重新添加; -p 导致 Perl 在输入行上循环并在运行脚本后打印每一行; $_ 是当前输入行,$. 是行号。

【讨论】:

  • 单行是我在使用 Perl 时怀念的事情之一。
【解决方案2】:

这是一个 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() 反转给定的字符串,并每隔一行调用一次。

【讨论】:

  • 投反对票的原因?答案有什么问题吗?
  • 打败我了,没毛病,点个赞来补偿一下。
  • 我看到的唯一问题是我认为 OP 没有要求 awk,但我错了。第二次赞成作为反对票的“一般”奖金。 :-D
  • 同意大家的看法。尽管可以优化该解决方案,但没有任何问题。我已经添加了一个编辑,如果您觉得它过于激进,请恢复它。无论如何,你都会得到我的支持:)
  • @jaypalsingh 感谢您的编辑 :)
【解决方案3】:

简单的 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运行。

【讨论】:

    【解决方案4】:

    在几乎纯 bash 中,您可以保留一个变量以了解您正在读取偶数行还是奇数行,然后相应地应用 rev:

    f=0
    while IFS= read -r line
    do
        (( f%2 )) && rev <<< "$line" || echo "$line"
        (( f++ ))
    done < file > new_file
    

    测试

    打印到标准输出:

    while IFS= read -r line; do (( f%2 )) && rev <<< "$line" || echo "$line"; (( f++ )); done < a
    wassup
    tunod
    skateboard
    ! .hteet ?
    

    【讨论】:

      【解决方案5】:

      这是 Python 中的另一种解决方案:

      >>> text = ['wassup', 'donut', 'skateboard', '? teeth. !']
      >>> output = []
      >>> for num, line in enumerate(text):
      ...   if num % 2:  # Starting with the second line (which is an index of `1`...)
      ...     output.append(''.join(reversed(line)))  # Reverse the string, then join it into a new string.
      ...   else:
      ...     output.append(line)
      ... 
      >>> for line in output:
      ...   print(line)
      ... 
      wassup
      tunod
      skateboard
      ! .hteet ?
      >>> 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-10
        • 2022-08-17
        • 1970-01-01
        • 2017-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多