2015-05-31 12 views
-1

我有一個文件,其中每行的第28個字符是「A」或「D」。 我想換行的方式是文件的第一行應該有第28個字符爲「D」,文件的第二行應該有28個字符爲「A」。 模式應該貫穿整個文件。如何使用Shell腳本交換符合條件的文件中的行

輸入文件:

00254920141228N201412251850A201412241740SA1118WE1440SCL 
00254920141228N201412251850D201412200050SA1150TH1850000 
00254920141228R201412251850A201412241740SA1118WE1440SCL 
00254920141228R201412251850A201412241740SA1118WE1440SCL 
00254920141228R201412251850D201412200050SA1150TH1850000 
00254920141228R201412251850D201412200050SA1150TH1850000 

輸出應該是:

00254920141228N201412251850D201412200050SA1150TH1850000 
00254920141228N201412251850A201412241740SA1118WE1440SCL 
00254920141228R201412251850D201412200050SA1150TH1850000 
00254920141228R201412251850A201412241740SA1118WE1440SCL 
00254920141228R201412251850D201412200050SA1150TH1850000 
00254920141228R201412251850A201412241740SA1118WE1440SCL 

我想在Unix外殼腳本編寫腳本。

+0

您試過了什麼,它是如何失敗的?爲什麼你的樣本數據有A但是你的問題? – tripleee

+0

示例數據正確。每行第28個字符是A或D.我已經使用SED編寫了一個邏輯,但它不起作用。你能否提出你的建議以進一步處理。 – srisriv

+0

發佈您的'sed'腳本([編輯](http://stackoverflow.com/posts/30553286/edit)包含它的問題)並解釋它有什麼問題。有關詳細的發佈指南,請參閱[幫助](http://stackoverflow.com/help)部分。 – tripleee

回答

0

下面是一個簡單的Python腳本,它實現了我認爲你試圖描述的內容。

from sys import stdin 
keep = "A" 
kept = [] 
for line in stdin: 
    line = line.rstrip("\r\n") 
    pattern = line[27:28] 
    # print("## keep %s, pattern %s, %s" % (keep, pattern, line)) 
    if pattern != keep: 
     if len(kept) > 0: 
      print line 
      # print("### len kept == %i, popping" % len(kept)) 
      print kept.pop(0) 
     else: 
      # print("### no kept, just print") 
      print line 
      keep = pattern 
    else: 
     # print("### keeping for later") 
     keep = pattern 
     kept.append(line) 
if len(kept) > 1: 
    raise ValueError("Too many %s lines" % keep) 
elif len(kept) == 1: 
    print kept[0] 

我離開調試版畫所以你可以希望看到發生了什麼 - 取消註釋與他們#打印報表變得有點調試診斷,如果你想要什麼沒有做。

爲了簡單起見,我實際上已經開始將它作爲Awk腳本編寫,但Awk數組沒有push/pop,所以它比我更喜歡它。

我不會爲此使用sed。我不懷疑這是可行的,但這將很難維持,尤其是如果不是你和你的所有同事都致力於保持sed的高流利性。 (這是一個更好的方式來說「只寫語言」...)

我一直對所有Python字符串使用雙引號。這樣,您可以將其單引號插入到一個簡單的shell腳本中進行測試,如下所示:

#!/bin/sh 
python -c '... text 
of 
script' <<':' 
sample 
data 
: 
+0

我原本寫這個是爲了儘可能保持輸入的順序,然後只在輸入出現亂序時觸發器;將第一個賦值更改爲'keep = None'來恢復此行爲。你的問題特別要求第一行有D,即任何A行稍後保存在文件的開頭。 – tripleee

+0

感謝您的腳本。我是Python的新手,但我可以從我的solaris環境運行python腳本。我是否需要將輸入文件作爲參數? – srisriv

+0

Hi Triplee。我只是試圖通過在shell環境中包含這個python腳本,並按預期工作。 – srisriv

相關問題