簡體   English   中英

用於更改文件間距的Bash或python

[英]Bash or python for changing spacing in files

我有一組10000個文件。 在所有這些中,第二行看起來像:

AAA 3.429 3.84

所以AAA和其他兩列之間只有一個空間(要求)。 每個文件上的其余行完全不同,對應10列數字。

隨機地,大約20%的文件,並由於一些錯誤,一個人得到

BBB  3.429 3.84

所以現在第一列和第二列之間有兩個空格。

這是一個很大的錯誤,所以我需要修復它,在發生錯誤的文件中從2變為1。

我想到的第一種方法是編寫一個bash腳本,每個文件讀取第二行的3個值,然后用一個空格打印它們,為所有文件執行。

我想知道oyu對這種方法的看法是什么,如果你能提出更好的建議,bashm python或其他方法。

謝謝

sed執行基於行的文本文件更改通常最簡單。

sed -e '2s/  */ /g' infile.txt

將用一個空格替換多個空格的任何運行。 但是,這可能會比您想要的更改。

sed -e '2s/^\([^ ]*\)  /\1 /' infile.txt

應該只用一個空格替換第一個無空格文本塊后的兩個空格的實例(雖然我沒有測試過)。

編輯:在每個實例中在s之前插入2以將編輯綁定到第二行,具體而言。)

使用sed。

for file in *
do
  sed -i '' '2s/  / /' "$file"
done

-i ''標志表示在沒有備份的情況下進行就地編輯。

或使用ed!

for file in *
do
  printf "2s/  / /\nwq\n" |ed -s "$file"
done

如果錯誤總是發生在第二行,

for file in file*
do
    awk 'NR==2{$1=$1}1' file >temp
    mv temp "$file"    
done

或者sed

sed -i.bak '2s/  */ /' file* # do 2nd line

或者只是純粹的bash腳本

i=1
while read -r line
do
  if [ "$i" -eq 2 ];then
    echo $line
  else
    echo "$line"
  fi
  ((i++))
done <"file"

我會變得與眾不同並與AWK一起去:

awk '{print $1,$2,$3}' file.txt > file1.txt

這將處理字段之間的任意數量的空格,並用一個空格替換它們

要處理特定行,您可以添加行地址:

awk 'NR==2{print $1,$2,$3} NR!=2{print $0}' file.txt > file1.txt

即重寫第2行,但不改變其他行。

行地址也可以是正則表達式:

awk '/regexp/{print $1,$2,$3} !/regexp/{print}' file.txt > file1.txt

由於似乎每個列都被一個空格分隔,另一種尚未提及的方法是使用tr將所有多個空格壓縮到單個空格中:
tr -s“”<infile> outfile

我不太明白,但是,是的, sed是一種選擇。 我認為任何POSIX兼容版本的sed都沒有in-file選項(-i),所以完全符合POSIX標准的解決方案就是。

sed -e 's/^BBB  /BBB /' <file> > <newfile>

這個答案假設你不想亂用除第二行之外的任何一個。

#!/usr/bin/env python
import sys, os
for fname in sys.argv[1:]:
    with open(fname, "r") as fin:
        line1 = fin.readline()
        line2 = fin.readline()
        fixedLine2 = " ".join(line2.split()) + '\n'
        if fixedLine2 == line2:
            continue
        with open(fname + ".fixed", "w") as fout:
            fout.write(line1)
            fout.write(line2)
            for line in fin:
                fout.write(line)
    # Enable these lines if you want the old files replaced with the new ones.
    #os.remove(fname)
    #os.rename(fname + ".fixed", fname)

使用sed:

sed -e 's/[[:space:]][[:space:]]/ /g' yourfile.txt >> newfile.txt

這將用一個替換任何兩個相鄰的空格。 使用[[:space:]]只是讓它更清晰一點

sed -i -e '2s/  / /g' input.txt

-i:就地編輯文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM