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

时间:2015-04-28 15:04:55

标签: arrays bash awk sed cat

我已经通过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

感谢您抽出宝贵的时间和耐心。我感谢您提供的任何帮助。

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

因为你说过"预期输出中的线对之间的间距"实际上并不相关:

Collection

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

答案 2 :(得分:1)

在awk中:

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

或者在正常的shell中:

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

这些都显示为管道。当然,您可以根据需要重定向文件中的输入。

答案 3 :(得分:0)

这应该有效:

#!/bin/bash
count=-1;
while IFS= read -r line; do
printf "%s\n" "$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 "%s\n" "${arr[$i]}"
done