作者 主題: 問得太笨別罵我唷  (閱讀 5828 次)

0 會員 與 1 訪客 正在閱讀本文。

cwlvkimo

  • 活潑的大學生
  • ***
  • 文章數: 276
    • 檢視個人資料
    • http://cwlv.adsldns.org
問得太笨別罵我唷
« 於: 2003-07-12 17:38 »
各位大大好呀
小弟有一事請教
如果有下列一檔案
如何把第一個數字以遞增方試重新編號?
這是一個linux的檔案
對不起我是肉腳

1@@@20030706@@@0700@@@1000@@@ad@@@0@@@0@@@1a
1@@@20030706@@@0900@@@1100@@@cw@@@0@@@0@@@1b
1@@@20030706@@@0700@@@1000@@@ad@@@0@@@0@@@1a
2@@@20030706@@@0900@@@1100@@@cw@@@0@@@0@@@1b
3@@@20030706@@@0700@@@1000@@@ad@@@0@@@0@@@1a
4@@@20030706@@@0900@@@1100@@@cw@@@0@@@0@@@1b

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
問得太笨別罵我唷
« 回覆 #1 於: 2003-07-12 18:04 »
try:
代碼: [選擇]
FILE=source.file
for ((i=1;i<=$(wc -l $FILE | awk '{print $1}');i++)); do
  awk -F '@@@' "{ if (NR == $i) print $i"'\
  "@@@"$2"@@@"$3"@@@"$4"@@@"$5"@@@"$6"@@@"$7"@@@"$8}'\
  $FILE
done

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
問得太笨別罵我唷
« 回覆 #2 於: 2003-07-12 22:39 »
or:
代碼: [選擇]
FILE=source.file
for ((i=1;i<=$(wc -l $FILE | awk '{print $1}');i++)); do
  awk "{if (NR == $i) print \$0}" $FILE \
  |sed "s/^[^@]*/$i/"
done

cwlvkimo

  • 活潑的大學生
  • ***
  • 文章數: 276
    • 檢視個人資料
    • http://cwlv.adsldns.org
問得太笨別罵我唷
« 回覆 #3 於: 2003-07-14 09:27 »
引述: "netman"
or:
代碼: [選擇]
FILE=source.file
for ((i=1;i<=$(wc -l $FILE | awk '{print $1}');i++)); do
  awk "{if (NR == $i) print \$0}" $FILE \
  |sed "s/^[^@]*/$i/"
done


報告大大兩個都不行~~~~
 :cry:

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
問得太笨別罵我唷
« 回覆 #4 於: 2003-07-14 10:15 »
只考慮第一個數字嗎?
#!/bin/sh
declare -i n
n=0;
for i in `cat sort.data | sed -e 's/^[0-9]//'`;
do
        n=$n+1;
        echo "$n$i" >> sort2.data
done

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
問得太笨別罵我唷
« 回覆 #5 於: 2003-07-14 12:36 »
引述: "cwlvkimo"
引述: "netman"
or:
代碼: [選擇]
FILE=source.file
for ((i=1;i<=$(wc -l $FILE | awk '{print $1}');i++)); do
  awk "{if (NR == $i) print \$0}" $FILE \
  |sed "s/^[^@]*/$i/"
done


報告大大兩個都不行~~~~
 :cry:

error 為何?
標點符號都打對了嗎?

或試一試:
1) 將 awk 那兩行打成一行:
awk "{if (NR == $i) print \$0}" $FILE  |sed "s/^[^@]*/$i/"
2) 將 sed 那行改成:
| sed "s/^[0-9]*@/$i@/"
或:
| sed -e 's/\(@@@.*$\)/:&/' -e "s/^.*:/$i/"

cwlvkimo

  • 活潑的大學生
  • ***
  • 文章數: 276
    • 檢視個人資料
    • http://cwlv.adsldns.org
問得太笨別罵我唷
« 回覆 #6 於: 2003-07-15 11:55 »
引述: "thyme"
只考慮第一個數字嗎?
#!/bin/sh
declare -i n
n=0;
for i in `cat sort.data | sed -e 's/^[0-9]//'`;
do
        n=$n+1;
        echo "$n$i" >> sort2.data
done


是這樣的
計算總共有幾行
再把每行在 @ 前的數字重新排列
可能會很多數字所以第一個數字應該介於1~無限大吧
大大的程式是將 sort.data的資料處理過再導至sort2.data嗎?

試過大大的程式了...
有點小問題...似乎會把太長的句子視為兩行
而插入數字
小弟有點忙下午會再測試一下     謝謝

cwlvkimo

  • 活潑的大學生
  • ***
  • 文章數: 276
    • 檢視個人資料
    • http://cwlv.adsldns.org
問得太笨別罵我唷
« 回覆 #7 於: 2003-07-15 12:21 »
引述: "netman"
引述: "cwlvkimo"
引述: "netman"
or:
代碼: [選擇]
FILE=source.file
for ((i=1;i<=$(wc -l $FILE | awk '{print $1}');i++)); do
  awk "{if (NR == $i) print \$0}" $FILE \
  |sed "s/^[^@]*/$i/"
done


報告大大兩個都不行~~~~
 :cry:

error 為何?
標點符號都打對了嗎?

或試一試:
1) 將 awk 那兩行打成一行:
awk "{if (NR == $i) print \$0}" $FILE  |sed "s/^[^@]*/$i/"
2) 將 sed 那行改成:
| sed "s/^[0-9]*@/$i@/"
或:
| sed -e 's/\(@@@.*$\)/:&/' -e "s/^.*:/$i/"


ㄟ.....謝謝大大在課程中把小弟的案例拿出來討論
不過我是用copy  paste的方式作成檔案來執行的
我把錯誤貼上來看看ㄛ...

一個是這樣
./cal1: line 4: syntax error near unexpected token `|'
./cal1: line 4: `  |sed "s/^[^@]*/$i/" '

另一個
awk: cmd. line:1: { if (NR == 1) print 1\
awk: cmd. line:1:                       ^ backslash not last character on line
./cal1: line 5: /backup/calender.book: 拒絕不符權限的操作
awk: cmd. line:1: { if (NR == 2) print 2\
awk: cmd. line:1:                       ^ backslash not last character on line
./cal1: line 5: /backup/calender.book: 拒絕不符權限的操作
awk: cmd. line:1: { if (NR == 3) print 3\

thyme

  • 老人組
  • 俺是博士!
  • *****
  • 文章數: 1281
    • 檢視個人資料
問得太笨別罵我唷
« 回覆 #8 於: 2003-07-15 14:25 »
引述: "cwlvkimo"
引述: "thyme"
只考慮第一個數字嗎?


是這樣的
計算總共有幾行
再把每行在 @ 前的數字重新排列
可能會很多數字所以第一個數字應該介於1~無限大吧
大大的程式是將 sort.data的資料處理過再導至sort2.data嗎?

試過大大的程式了...
有點小問題...似乎會把太長的句子視為兩行
而插入數字
小弟有點忙下午會再測試一下     謝謝


如果netman大大能解決你的問題,那我的方法就算了...

我那方法只是重新編號,而且只有一個數字的情況。

我還是不太懂你的問題,重排是指每列的位置會隨著最前面的編號而變,
還是只改前面的編號?編號會不會重覆?格式是不是固定?
這些都會影響程式的流程,
如果只是簡單判斷前面的編號來重新排列的話,
直接用 sort -n befort_sort.data > after_sort.data
就可以了。

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
問得太笨別罵我唷
« 回覆 #9 於: 2003-07-15 16:17 »
嗯,你可以 copy & past ,但建議你將之改為同一行...
因為 error 說你沒有用 \ 將 CR 給 escape 掉...

或,又可再試:
代碼: [選擇]
FILE=source.file
sed 's/^[^@]*//' $FILE | awk '{print NR$0}'

是的,一行就搞定﹗我之前寫的都太複雜了...  ^_^

cwlvkimo

  • 活潑的大學生
  • ***
  • 文章數: 276
    • 檢視個人資料
    • http://cwlv.adsldns.org
問得太笨別罵我唷
« 回覆 #10 於: 2003-07-15 16:27 »
引述: "thyme"
引述: "cwlvkimo"
引述: "thyme"
只考慮第一個數字嗎?


是這樣的
計算總共有幾行
再把每行在 @ 前的數字重新排列
可能會很多數字所以第一個數字應該介於1~無限大吧
大大的程式是將 sort.data的資料處理過再導至sort2.data嗎?

試過大大的程式了...
有點小問題...似乎會把太長的句子視為兩行
而插入數字
小弟有點忙下午會再測試一下     謝謝


如果netman大大能解決你的問題,那我的方法就算了...

我那方法只是重新編號,而且只有一個數字的情況。

我還是不太懂你的問題,重排是指每列的位置會隨著最前面的編號而變,
還是只改前面的編號?編號會不會重覆?格式是不是固定?
這些都會影響程式的流程,
如果只是簡單判斷前面的編號來重新排列的話,
直接用 sort -n befort_sort.data > after_sort.data
就可以了。


其實 netman大大的沒有效耶~~~我試不出來
我只要判斷有幾行把他在@@@前重新編號

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
問得太笨別罵我唷
« 回覆 #11 於: 2003-07-15 16:38 »
很奇怪,能將你的檔案寄給我嗎?

你應在 www.study-area.org 有 col 的帳號吧?
請 login 後試:
cat /home/col/kenny/1.txt | sed 's/^[^@]*//' | awk '{print NR$0}'