【问题标题】:ksh increment the while loop argumentksh 增加 while 循环参数
【发布时间】:2018-10-30 16:48:19
【问题描述】:

在 Ksh 中,我有一个读取 2 个文件的 while 循环。如果文件 1 的当前行是“Y”,则将文件 2 的当前行回显到新文件中,如果文件 1 的当前行是“N”,则在 winscp 中回显“waste”。

    while IFS= read xxxx && IFS= read yyyy <&4; do
if [[ ${xxxx} = "N" ]];then
      echo waste
   else
      echo "$yyyy" .>> $newfile
   fi
done <"$file1" 4<"$file2"

但是,如果文件 1 的前三行为 N,其余七行为 Y,而不是将第二个文件的最后七行打印 3 次“浪费”到新文件中,我的 Winscp 显示 10 次“浪费”,而运行脚本。

【问题讨论】:

标签: shell unix ksh


【解决方案1】:

假设 file1 和 file2 中的行数相同,并且 file1 的每一行都是 N 或 Y,您可以使用类似的内容:

    #!/bin/ksh

    testArray=($(cat file1.txt))

    i=0

    while read line; do
        if [[ ${testArray[$i]} == "N" ]]; then
            print "waste"
        else
            print $line >> file3.txt
        fi
        ((i++))
    done < file2.txt

或关注cmets

    #!/bin/ksh


    while read -r -u 3 line1 && read -r -u 4 line2; do
            if [[ $line1 == "N" ]]; then
                    print "waste"
            else
                    print $line2 >> file3.txt
            fi
    done 3<file1.txt 4<file2.txt

适用于我的(非常)小测试文件...

【讨论】:

  • 你好安德烈。感谢您的答复。我也想到了数组方法。但实际文件行数可能高达十亿行(两个文件相等)。数组是否具有存储大量下标的能力。
  • 视情况而定,但 4194303 是 ksh93 中通常的最大索引。当你说,十亿……你的意思是“很多”还是字面意思?另一方面,我认为 bash 并没有实际的最大节省内存量(但不要引用我的话;))
  • @GowthamSarathy 我添加了一个新的,看起来可以根据您的评论工作。
  • 你好安德烈。我已经尝试了第二种选择。但输出仍然与我在主要问题中提到的相同。我制作了一个有 10 行 (NYYNYYYYYN) 的文件 1,所以我应该从文件 2 中获得 7 条记录到文件 3 和 3 次“浪费”,但我只有 10 次“浪费”。
  • 很高兴听到这个消息。请考虑选择一个答案,以便人们知道您不再寻找答案。美好的一天!
【解决方案2】:

我看不出有什么问题。也许file1 在“N”之后还有其他字符,例如空格N、其他字符NO\r(Windows 文件)。或小写n

另一种解决方案可能是使用paste。查找不在 file1 中的字符(例如 #),然后使用该字符将两个文件粘贴在一起。
并用 10 行测试解决方案,而不是十亿行(评论其他答案)。

paste -d'#' file1 file2

也许你在应该以N# 开头的行上看到了一些奇怪的东西。 现在您可以使用sed 来打印p 行或w 写入文件。

paste -d'#' file1 file2 | sed -n 's/^N#.*/waste/p;s/^[^#]*#//w newfile'

【讨论】:

  • 喂。我对答案感到困惑。让我向您展示文件示例以及预期输出。
  • 您可以使用printf "%s\n" N Y Y &gt; file1; printf "%s\n" 1Content 2Content 3Content &gt; file2 制作测试文件并运行paste 命令。新文件 newfile 应该有 2 行所需的行,一次在标准输出上“浪费”。
  • 嗨沃尔特。如果您对我的情况感到困惑,请让我向您解释一次。文件 1(它会在那里,我们不需要创建它)(新行中的每个字符) Y Y N 文件 2(已经可用)(每行中的每个)1Content 2Content 3Content 预期输出:(每个新行中)新文件:1Content 2Content 和第三次迭代打印“waste”
  • 我能再解释一下你的两个代码吗?我不太清楚。
  • 先看paste -d'#' file1 file2的结果(把file1和file2换成实际的文件名)。结果将是以N#Y# 开头的行。使用sed,您可以用waste 替换以N# 开头的行。也许首先看paste -d'#' file1 file2 | sed -n 's/^[^#]*#//p,其中忽略了浪费,并删除了其他行的第一部分(直到第一个#)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 2017-09-22
相关资源
最近更新 更多