2013-08-27 21 views
1

注:我使用的是OS X重新排列數據到指定的行長度

我有一個數據文件,它是隻是數字的一個長長的清單,有一個單獨的行中的每個條目:

23 
    28 
    26 
    14 
    ... 

我需要長期的37條記錄/字段重新排列行數據:

23 28 26 14 1 2 3 4 5 6 7 8 9 2 4 5 6 9 4 8 7 6 3 2 5 9 4 1 2 5 7 8 9 4 6 1 2 
5 8 6 4 3 5 23 28 26 14 1 2 3 4 5 6 7 8 9 2 4 5 6 9 4 8 7 6 3 2 5 9 4 1 2 5 7 
... 

這是我試過的代碼:

awk '{ 
    for(i=1;i<=NF;i+=1) { 
     if(i%37 != 0) printf $i" "; 
     else printf "$i\n" 
     } 
    }' 
    input.txt > output.txt 

第一printf $i" "似乎是工作,但是有些事情似乎是錯誤的,因爲條件不管我告訴它在else聲明打印不打印。也許只是一個語法疏忽?

有趣的是,當我只需運行:

awk '{for(i=1;i<=NF;i+=1) printf $i" "}' input.txt > output.txt 

結果文件,可將數據的一些到37的記錄長度行,但有的還更長......會是這樣一個結果數據中的一些神器? (數據已經通過一些排序/組織功能運行。)

+0

您問題的癥結在於您使用了「記錄/字段」一詞。他們不一樣,你對這種差異感到困惑。一個文件由記錄組成。每條記錄都由字段組成。默認的記錄分隔符是換行符。默認字段分隔符是一系列連續的空格。所以,你的輸入文件包含37個記錄,每個記錄包含1個字段。你的腳本正在比較'NF'(當前記錄中的字段數)和37。看到問題了嗎? –

回答

1

NF變量是記錄中的字段數。您應該使用NR變量,表示備案號:

awk '{printf NR%37?"%d ":"%d\n", $1}' file 
+0

工作完美;謝謝!仍然不明白爲什麼我的原始循環無法正常工作......並且我將不得不閱讀更多內容才能確切瞭解您的單行'awk'在做什麼......但是,謝謝! – jwb4

+0

@ zephyr44它使用三元運算符'...? ...:...'。如果'?'之前的值爲真(非零),則使用'?'和':'之間的值。如果它是假(零),則使用':'後的值。在這種情況下,如果記錄號「NR」不是37的倍數,則使用的格式字符串是「」%d「'。否則,如果它是一個倍數,那麼格式字符串是'「%s \ n」'。 – user000001

+0

SO。有用。再次感謝! – jwb4

1

一個簡單的解決方案,可能對你有幫助xargs -n37 < file

演示

命令seq剛剛打印使用xargs -n3我們能與3個字段組單塔成記錄數的一個seqence由一個新行(默認)分隔

$ seq 1 9 | xargs -n3 
1 2 3 
4 5 6 
7 8 9