如何只反转包含匹配的行?

时间:2016-12-15 20:49:19

标签: bash shell

像这样:

输入:

Daniel: some_text
Jack: some_text1
Mark: some_text2
Daniel: some_text3
Jack: some_text4

输出:

Daniel: some_text3
Jack: some_text4
Mark: some_text2
Daniel: some_text
Jack: some_text1

马赫需要是“:”之前的第一个字符串

2 个答案:

答案 0 :(得分:0)

实现@Barmar注释但没有awk使用文件来保存值数组

#!/bin/bash
lines=`cat $1 | tr -d " "`
for line in $lines; do
  key=$(echo $line | cut -d : -f 1)
  value=$(echo $line | cut -d : -f 2)
  echo "$key: $value" >> "$key.tmp";
done

echo -n "" > output.txt
for line in $lines; do
  key=$(echo $line | cut -d : -f 1)
  tail -n 1 $key.tmp >> output.txt
  head -n -1 $key.tmp > temp.tmp
  mv temp.tmp $key.tmp
done

rm *.tmp

我使用tail和head来模拟堆栈的pop函数。性能不是很好,但它确实有效,因为我不用bash编码

运行bash脚本,将文件名作为输入

的参数传递

答案 1 :(得分:0)

这是另一种选择

$ cat -n file > filen; paste <(sort -k2,2 filen) <(sort -k2,2 -k1,1nr filen) | 
  awk '{print $1,$2,$NF}' | 
  sort -n | 
  cut -d' ' -f2-

Daniel: some_text3
Jack: some_text4
Mark: some_text2
Daniel: some_text
Jack: some_text1