我需要从固定长度的文件中剪切行并将其粘贴到以 180 开头且位置 35 具有"N"的行的新文件中。我正在使用** bash **
**Sample input file:**
070000001 075PRMAGDALENA F DEL 180AP997270518411 Y02092014
180AP997270518412 N02092014
180AP997270518413 N03212013
PAYMNT
190EM037490013798700
070000002 075PRRERUCHA TROY A 195097130808020800 070000003
180AP997270518423 Y03212013
**Sample input end**
代码:
while IFS= read -r line
do
## var=$((var+1))
if [ ${line:0:3} = '180' ] && [ ${line:34:1} = 'N' ] ;
then
echo $line > online_error.txt
else
echo $line > online_good.txt
fi
done <"$file"
代码结束
**输出开始 **
180AP997270518423 N03212013
**输出端 **在上面的输出中,空格丢失了。我希望我的输出与输入行具有相似的间距。在我的输入文件中,字母"N"的位置为 35,而 out 则将其定位为 19。
if 部分将输出写入文件,但是我丢失了格式。我需要保留原始格式,因为此脚本的输出是另一个大型机程序的输入。
请提供建议。
假设语句"位置 35 是 N"和"第二个字段以 N 开头"是等效的,您可以使用 awk
命令
awk '$1 ~ /^180/ && $2 ~ /^N/ {
print $0 > "online_error.txt";
next;
}
{ print $0 > "online_good.txt" }' "$file"
您可以考虑以下替代方法:
cat b.txt | grep -E '^180.{32}N' > newFile.txt
提取以180
开头并在第 35 列中具有N
的行;以及
cat b.txt | grep -E -v '^180.{32}N' > remainder.txt
对于所有其他人。
注意 - -E
标志是在 Mac OS 上用于"扩展正则表达式"的标志。或者,您可以使用egrep
- 然后您不需要该标志。我认为这在其他版本的Unix中是一样的。
如果您确定第二列中的字母始终是"空格后的第一个字母",您也可以尝试
egrep '^180.* N' < b.txt > newFile.txt
及其补充:
egrep -v '^180.* N' < b.txt > newFile.txt