2014-02-09 86 views
1

我需要從固定長度的文件中剪切行並將其粘貼到以180開頭且位置35具有「N」的行的新文件中。 我使用** **慶典根據unix中的列值刪除行

**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

你是什麼意思「我失去了格式」? – Floris

+1

使用'echo'$ line「'來保留行中的間距。 –

+0

echo $ line,以某種方式不保留間距 – user3290216

回答

1

你可以考慮以下選擇:

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 
+0

我用egrep和其餘的工作正常,但newFile沒有記錄產生。 – user3290216

+0

這是奇怪的 - 因爲'-v'標誌說的是「所有不匹配的東西」,所以你會期望同樣的表達式_without_-v'標誌來產生其餘的部分......你有沒有任何機會一個錯字? – Floris

2

假設語句「位置35是N」和「第二個字段以N開頭」是等效的,您可以使用awk命令

awk '$1 ~ /^180/ && $2 ~ /^N/ { 
     print $0 > "online_error.txt"; 
     next; 
    } 
    { print $0 > "online_good.txt" }' "$file" 
+0

工作!謝謝。 – user3290216