我需要从固定长度的文件中剪切线条并将其粘贴到新文件中,以便以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,其中输出为19。
if部分将输出写入文件但是我丢失了格式。我需要保留原始格式,因为此脚本的输出是另一个大型机程序的输入。
请提供建议。
答案 0 :(得分:2)
假设语句“位置35为N”且“第二个字段以N开头”是等效的,您可以使用awk
命令
awk '$1 ~ /^180/ && $2 ~ /^N/ {
print $0 > "online_error.txt";
next;
}
{ print $0 > "online_good.txt" }' "$file"
答案 1 :(得分:1)
您可以考虑以下替代方案:
cat b.txt | grep -E '^180.{32}N' > newFile.txt
在第35列中提取以180
开头且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