【发布时间】:2021-05-31 22:39:08
【问题描述】:
查找以“DESC:”开头的行,找到最后一个单词,如果匹配:将行和上一行写入另一个文件
我读到了这个Replacing the last word of a line only if match string found 但不幸的是
我有一个长文本文件,其中包含 2 行连续的行:一个带有文件路径,下一个带有描述,例如 f.i.:
PATH: /all movies/DE/0051.mkv
DESC: Bloodshot German
PATH: /all movies/DE/0052.mkv
DESC: Birds of Prey German
PATH: /all movies/EN/0074.mkv
DESC: Army of One English
实际上,如果最后一个单词匹配以“DESC:”开头的行,则将行和上一行写入另一个文件。
我现在使用“while read loop”,但这太慢了。
DIR="c:/all movies/"
FILE1="${DIR}/movies_GE.txt"; echo "MOVIES GERMAN" > ${FILE1)
FILE2="${DIR}/movies_EN.txt"; echo "MOVIES ENGLISH" > ${FILE2)
while read LINE1; do
if [[ ${LINE1:0:4} = "PATH:" ]]; then
read LINE2
if [[ ${LINE2:0:4} = "DESC:" ]]; then
LASTWORD=`awk '{print $NF}' <<< ${LINE2}`
if grep -iq "German" <<< ${LASTWORD}; then echo ${LINE1} >> ${FILE1}; echo ${LINE2} >> ${FILE1}; fi
if grep -iq "English" <<< ${LASTWORD}; then echo ${LINE1} >> ${FILE2}; echo ${LINE2} >> ${FILE2}; fi
fi
fi
done < ${DIR}/all movies/movies_ALL.txt
是否有(很多)更好/更快的解决方案 f.i.用 sed?
我试过了:
sed -ir '/^"DESC:":.*/s/^(.* )German$//g' ${FILE1}
sed -ir '/^"DESC:":.*/s/^(.* )English$//g' ${FILE2}
【问题讨论】:
-
sed无法将行重定向到不同的文件。使用awk。