【问题标题】:How to read two lines in shell script (In single iteration line1, line2 - Next iteration it should take line2,line3.. so on)如何读取 shell 脚本中的两行(在单次迭代中第 1 行、第 2 行 - 下一次迭代应该采用第 2 行、第 3 行……依此类推)
【发布时间】:2020-11-24 20:58:35
【问题描述】:

在我的 shell 脚本中,其中一个变量包含一组行。我需要在我的 awk 需要的单次迭代中获取两行信息。

变量包含:

12 abc
32 cdg
9 dfk
98 nhf
43 uyr
5 ytp

在这里,在循环中我需要 line1, line2[i.e 12 abc \n 32 cdg] 内容,下一次迭代需要 line2, line3 [32 cdg \n 9 dfk] 等等..

我试图通过

while IFS= read -r line
do
count=`echo ${line} | awk -F" " '{print $1}'`
id=`echo ${line} | awk -F" " '{print $2}'`
read line
next_id=`echo ${line} | awk -F" " '{print $2}'`
echo ${count}
echo ${id}
echo ${next_id}

## Here, I have some other logic of awk..
done <<< "$var"

它在第一次迭代时读取第 1 行、第 2 行。在第二次迭代中,它正在读取第 3 行、第 4 行。但是,我需要在第二次迭代时阅读 line2、line3。任何人都可以解决我的要求。

提前谢谢..

【问题讨论】:

  • 预期输出是什么?

标签: bash shell


【解决方案1】:

当调用awk 时,不要混合为awk 每次迭代 生成3 个独立子shell 的shell 脚本。对于大型输入文件,速度会快几个数量级。

您可以根据需要对消息进行分组,只需将第一行保存在变量中,跳到下一条记录,然后将变量中的行和当前记录打印到文件末尾即可。例如,在名为lines 的文件中使用您的行,您可以这样做:

awk 'FNR==1 {line=$0; next} {print line"\n"$0"\n"; line=$0}' lines

使用/输出示例

$ awk 'FNR==1 {line=$0; next} {print line"\n"$0"\n"; line=$0}' lines
12 abc
32 cdg

32 cdg
9 dfk

9 dfk
98 nhf

98 nhf
43 uyr

43 uyr
5 ytp

(额外的换行符只是为了显示分隔符,可以根据需要更改输出格式)

如果需要,您可以添加一个计数器并通过END 规则输出计数。

【讨论】:

    【解决方案2】:

    解决方案取决于您要如何处理这两行。
    我的第一个想法是这样的

    sed '2,$ s/.*/&\n&/' <<< "${yourvar}"
    

    但是当您必须处理两行时,这将无济于事(我认为| xargs -L2 无济于事)。
    当您希望它们循环时,请尝试

    while IFS= read -r line; do
       if [ -n "${lastline}" ]; then
          echo "Processing lines starting with ${lastline:0:2} and ${line:0:2}"
       fi
       lastline="${line}"
    done <<< "${yourvar}"
      
    

    【讨论】:

      猜你喜欢
      • 2019-03-16
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 2021-05-31
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多