2016-11-20 11 views
-1

私は1つのテキストファイルを持っています。このファイルには5行と5列があります。すべての列は "|"で区切られています(シンボル)。 2列目(内容)の長さは7文字でなければなりません。Unixシェルスクリプト - テキストファイル内の特定の文字を削除するにはどうすればよいですか?

第2列の長さが7文字を超える場合。その後、そのファイルを開かずに余分な文字を削除したいと思います。例えば

cat file1 

FF | haha​​ha1 | kjbsb | 122344 | jbjbnjuinnv |

df | hadb123_udcvb | sbfuisdbvdkh | 122344 | jbjbnjuinnv |

gf | harayhe_jnbsnjv | sdbvdkh | 12234 | jbjbnj |

qq | kkksks2 | datetag | 7777 | jbjbnj |

jj | harisha | hagte | 090900 | hags |

上記の場合、2番目の列の長さを持つ2番目と3番目の行は7文字以上です。今すぐawkまたはsedコマンドを使用して入力ファイルを開くことなく余分な文字を取り除きたい

私はあなたの回答を待っています。

ありがとうございます!

+0

はhttps://stackoverflow.comを見ます/ edit-help、明瞭にするために出力を追加してください。また、https://stackoverflow.com/help – Sundeep

+2

ファイルを開くことなく編集することはできません。 –

+1

「入力ファイルを開くことなく」という要件が意味することは、正確には不明です。入力ファイルを読むためには、ファイル_を開く必要があります。入力ファイルを_overwrite_したくない場合は、(@ TomFenechの答えのように)代わりに一時ファイルに書き込むことができます。 – e0k

答えて

2

awkを有する第二のカラムから長さ7のストリングを取る:

awk -F'|' -v OFS='|' '{ $2 = substr($2, 1, 7) }1' file 

は今7文字より長い任意の文字列は短くなります。短い文字列はそのまま残します。最後に

1は、デフォルトのアクション、{ print }をトリガする最短条件です。

あなたが変更に満足している場合、あなたは、このような元のファイルを上書きすることができます。

awk -F'|' -v OFS='|' '{ $2 = substr($2, 1, 7) }1' file > tmp && mv tmp file 

すなわち一時ファイルにリダイレクトし、元を上書きします。まず

0

ここで何が起こっている

sed 's/\(^[^|]*|[^|]\{7\}\)[^|]*/\1/' file1 

を試してみてください?これは、所望の出力を示していた場合、あなたが入力ファイルを変更するためのオプション-iを追加することができます

# Replace something 
sed 's/hadb123_udcvb/replaced/' file1 
# Remember the matched string (will be used in a later command) 
sed 's/\(hadb123_udcvb\)/replaced/' file1 
# Replace a most 7 characters without a '|' (one time each line) 
sed 's/\([^|]\{7\}\)/replaced/' file1 
# Remove additional character until a '|' 
sed 's/\([^|]\{7\}\)[^|]*/replaced/' file1 
# Put back the string you remembered 
sed 's/\([^|]\{7\}\)[^|]*/\1/' file1 
# Extend teh matched string with Start-of-line (^), any-length first field, '|' 
sed 's/\(^[^|]*|[^|]\{7\}\)[^|]*/\1/' file1 

::私たちは、コマンドステップ・バイ・ステップを構築

sed -i 's/\(^[^|]*|[^|]\{7\}\)[^|]*/\1/' file1 
関連する問題