"grep -B 1" 每个结果一行
"grep -B 1" one line per result
大家好,希望以下内容有意义。
我有一个文件,它包含很多垃圾以及我希望保留的一些数据,我希望提取的数据是包含“=>”的任何行加上前一行,我的问题是,我真的需要输出(包含=>的行和上一行)包含在同一行
示例:
junk
input <= lala
thing1 => lululu
more junk
more junks
even more junks
input <= junk
extra junk
hello123 => lelele
input <= lololo
thing3 => kt
我目前使用的"grep -B 1 '=>' file1"是:
input <= lala
thing1 => lululu
--
extra junk
hello123 => lelele
--
input <= lololo
thing3 => kt
我真正想要的是或类似的东西。
input <= lala thing1 => lululu
--
extra junk hello123 => lelele
--
input <= lololo thing3 => kt
假设您使用的是 bash,您可以一行完成:
t="";for i in $(grep -B 1 '=>' tmp.txt) ; do if [[ "$i" != "--" ]] ;then t="$t $i"; else echo "$t";echo "--";t="";fi;done;echo "$t"
输出:
alfasi$ t="";for i in $(grep -B 1 '=>' tmp.txt) ; do if [[ "$i" != "--" ]] ;then t="$t $i"; else echo "$t";echo "--";t="";fi;done;echo "$t"
input <= lala thing1 => lululu
--
extra junk hello123 => lelele
--
input <= lololo thing3 => kt
lgml-alfasi2:bin alfasi$
使用 here string
然后在 while
循环中使用 toggle
读取输入的过程并不太困难。有许多不同的方法可以做到这一点。刚想到这个。
#!/bin/bash
# read input filename as first argument
ifn=""
# validate file is readable
[ -r "$ifn" ] || {
printf "error: file not readable '%s'.\n" "$ifn"
exit 1
}
declare -i a=0 # use 'a' as first/second line toggle
## for each line in results
while read -r line; do
[ ${line:0:1} == '-' ] && { a=0; continue; } # skip -- lines
[ $a -eq 0 ] && sav="$line" # if a=0, save line
if [ $a -eq 1 ]; then # if a=1, form output
myline="${sav} ${line}"
# printf -- "--\n" # uncomment for separator
printf "%s\n" "$myline"
fi
[ $a -eq 0 ] && a=1 || a=0 # toggle a=0/1
done <<< "$(grep -B 1 '=>' "$ifn")"
exit 0
输入
$ cat dat/twotoone.dat
junk
input <= lala
thing1 => lululu
more junk
more junks
even more junks
input <= junk
extra junk
hello123 => lelele
input <= lololo
thing3 => kt
输出
$ bash twointoone.sh dat/twotoone.dat
input <= lala thing1 => lululu
extra junk hello123 => lelele
input <= lololo thing3 => kt
注意: 如果你想要行与行之间的分隔符,那么在打印之前添加以下内容 $myline
:
printf -- "--\n"
带分隔符的输出
$ bash twointoone.sh dat/twotoone.dat
--
input <= lala thing1 => lululu
--
extra junk hello123 => lelele
--
input <= lololo thing3 => kt
这很简单 awk
awk '/=>/ {print a,[=10=]"\n--"} {a=[=10=]}' file
input <= lala thing1 => lululu
--
extra junk hello123 => lelele
--
input <= lololo thing3 => kt
--
如果您不喜欢打印最后一个--
:
awk '/=>/ {print (f++?"--\n":"")a,[=11=]} {a=[=11=]}' file
input <= lala thing1 => lululu
--
extra junk hello123 => lelele
--
input <= lololo thing3 => kt
大家好,希望以下内容有意义。
我有一个文件,它包含很多垃圾以及我希望保留的一些数据,我希望提取的数据是包含“=>”的任何行加上前一行,我的问题是,我真的需要输出(包含=>的行和上一行)包含在同一行 示例:
junk
input <= lala
thing1 => lululu
more junk
more junks
even more junks
input <= junk
extra junk
hello123 => lelele
input <= lololo
thing3 => kt
我目前使用的"grep -B 1 '=>' file1"是:
input <= lala
thing1 => lululu
--
extra junk
hello123 => lelele
--
input <= lololo
thing3 => kt
我真正想要的是或类似的东西。
input <= lala thing1 => lululu
--
extra junk hello123 => lelele
--
input <= lololo thing3 => kt
假设您使用的是 bash,您可以一行完成:
t="";for i in $(grep -B 1 '=>' tmp.txt) ; do if [[ "$i" != "--" ]] ;then t="$t $i"; else echo "$t";echo "--";t="";fi;done;echo "$t"
输出:
alfasi$ t="";for i in $(grep -B 1 '=>' tmp.txt) ; do if [[ "$i" != "--" ]] ;then t="$t $i"; else echo "$t";echo "--";t="";fi;done;echo "$t"
input <= lala thing1 => lululu
--
extra junk hello123 => lelele
--
input <= lololo thing3 => kt
lgml-alfasi2:bin alfasi$
使用 here string
然后在 while
循环中使用 toggle
读取输入的过程并不太困难。有许多不同的方法可以做到这一点。刚想到这个。
#!/bin/bash
# read input filename as first argument
ifn=""
# validate file is readable
[ -r "$ifn" ] || {
printf "error: file not readable '%s'.\n" "$ifn"
exit 1
}
declare -i a=0 # use 'a' as first/second line toggle
## for each line in results
while read -r line; do
[ ${line:0:1} == '-' ] && { a=0; continue; } # skip -- lines
[ $a -eq 0 ] && sav="$line" # if a=0, save line
if [ $a -eq 1 ]; then # if a=1, form output
myline="${sav} ${line}"
# printf -- "--\n" # uncomment for separator
printf "%s\n" "$myline"
fi
[ $a -eq 0 ] && a=1 || a=0 # toggle a=0/1
done <<< "$(grep -B 1 '=>' "$ifn")"
exit 0
输入
$ cat dat/twotoone.dat
junk
input <= lala
thing1 => lululu
more junk
more junks
even more junks
input <= junk
extra junk
hello123 => lelele
input <= lololo
thing3 => kt
输出
$ bash twointoone.sh dat/twotoone.dat
input <= lala thing1 => lululu
extra junk hello123 => lelele
input <= lololo thing3 => kt
注意: 如果你想要行与行之间的分隔符,那么在打印之前添加以下内容 $myline
:
printf -- "--\n"
带分隔符的输出
$ bash twointoone.sh dat/twotoone.dat
--
input <= lala thing1 => lululu
--
extra junk hello123 => lelele
--
input <= lololo thing3 => kt
这很简单 awk
awk '/=>/ {print a,[=10=]"\n--"} {a=[=10=]}' file
input <= lala thing1 => lululu
--
extra junk hello123 => lelele
--
input <= lololo thing3 => kt
--
如果您不喜欢打印最后一个--
:
awk '/=>/ {print (f++?"--\n":"")a,[=11=]} {a=[=11=]}' file
input <= lala thing1 => lululu
--
extra junk hello123 => lelele
--
input <= lololo thing3 => kt