Bash 脚本以特定的顺序或顺序显示结果
Bash script display results in a specific order or sequence
我已经通过 sed awk 和数组操作((在 bash)中尝试了各种解决方案),但还没有找到实现以下目标的可靠方法:
假设我有一个名为 states.txt
的文件,其中包含:
Alabama
Alaska
Arizona
Arkansas
California
Colorado
and so-on and so forth
我想 cat 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 {prev=[=10=]; next} {print prev, [=10=]; prev=[=10=]}'
因此,例如 5
数字序列将输出:
$ seq 5 | awk 'NR==1 {prev=[=11=]; next} {print prev, [=11=]; prev=[=11=]}'
1 2
2 3
3 4
4 5
在 awk 中:
awk 'length(last){print last} {print; print ""; last=[=10=];}'
或正常 shell:
last=""
while read line; do
[ -n "$last" ] && printf "%s\n" "$last"
printf "%s\n\n" "$line"
last="$line"
done
这些都显示为管道。当然,您可以根据需要重定向文件中的输入。
既然你说 "expected output" 中的行对之间的间距实际上不相关:
$ awk 'NR>1{print p ORS [=10=]} {p=[=10=]}' file
Alabama
Alaska
Alaska
Arizona
Arizona
Arkansas
Arkansas
California
California
Colorado
警告 - 如果您的文件仅包含 1 行,则不会打印。如果需要这种情况,可以使用 END 部分轻松修复。
这应该有效:
#!/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
我已经通过 sed awk 和数组操作((在 bash)中尝试了各种解决方案),但还没有找到实现以下目标的可靠方法:
假设我有一个名为 states.txt
的文件,其中包含:
Alabama
Alaska
Arizona
Arkansas
California
Colorado
and so-on and so forth
我想 cat 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 {prev=[=10=]; next} {print prev, [=10=]; prev=[=10=]}'
因此,例如 5
数字序列将输出:
$ seq 5 | awk 'NR==1 {prev=[=11=]; next} {print prev, [=11=]; prev=[=11=]}'
1 2
2 3
3 4
4 5
在 awk 中:
awk 'length(last){print last} {print; print ""; last=[=10=];}'
或正常 shell:
last=""
while read line; do
[ -n "$last" ] && printf "%s\n" "$last"
printf "%s\n\n" "$line"
last="$line"
done
这些都显示为管道。当然,您可以根据需要重定向文件中的输入。
既然你说 "expected output" 中的行对之间的间距实际上不相关:
$ awk 'NR>1{print p ORS [=10=]} {p=[=10=]}' file
Alabama
Alaska
Alaska
Arizona
Arizona
Arkansas
Arkansas
California
California
Colorado
警告 - 如果您的文件仅包含 1 行,则不会打印。如果需要这种情况,可以使用 END 部分轻松修复。
这应该有效:
#!/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