Bash 脚本按特定顺序或顺序显示结果



我已经通过 sed awk 和数组操作((在 bash 中))尝试了各种解决方案,但没有找到实现以下目的的可靠方法:

假设我有一个名为 states.txt 的文件,其中包含:

Alabama
Alaska
Arizona
Arkansas
California
Colorado
and so-on and so forth

我想猫states.txt,结果是第一和第二状态,然后是第二和第三状态,然后是第三和第四状态,依此类推。

我还想忽略状态按字母顺序排列的事实(我要搜索的实际文件内容不是按此顺序排列的)。

结果应如下所示:

Alabama
Alaska
then
Alaska
Arizona
then
Arizona
Arkansas
then
Arkansas
California
then
California
Colorado
and so-on and so forth

感谢您在这件事上的时间和耐心。 我感谢提供的任何帮助。

既然你说"预期输出"中行对之间的间距实际上无关紧要:

$ awk 'NR>1{print p ORS $0} {p=$0}' file
Alabama
Alaska
Alaska
Arizona
Arizona
Arkansas
Arkansas
California
California
Colorado

警告 - 如果您的文件仅包含 1 行,则不会打印。如果需要,可以使用 END 部分轻松修复。

我会使用这样的东西,存储上一行并将其与下一行一起打印:

awk 'NR==1 {prev=$0; next} {print prev, $0; prev=$0}'

例如,将输出一系列5数字:

$ seq 5 | awk 'NR==1 {prev=$0; next} {print prev, $0; prev=$0}'
1 2
2 3
3 4
4 5

在awk中:

awk 'length(last){print last} {print; print ""; last=$0;}'

或在普通外壳中:

last=""
while read line; do
 [ -n "$last" ] && printf "%sn" "$last"
 printf "%snn" "$line"
 last="$line"
done

它们都显示为管道。 当然,如果需要,您可以从文件中重定向输入。

这应该有效:

#!/bin/bash
count=-1;
while IFS= read -r line; do
printf "%sn" "$line"
((count++))
[[ $count == 1 ]] && printf "n" && count=-1;
done <states.txt

另一种解决方案:

IFS=$'n'
arr=($(< file))
for ((i=0;i<${#arr[@]};i++)); do
[[ $((i%2)) -eq 0 && $i != 0 ]] && printf "n"
printf "%sn" "${arr[$i]}"
done

相关内容

  • 没有找到相关文章

最新更新